bash: Checking a port number

Image by Manfred Heyde.

Ever needed to check if a given port number is valid in bash? It’s harder than it looks because if you accept any input from the user, you can’t use declare -i since it spews errors and aborts functions if the input is malformed.

An example:

declare -i foo='10#88f'
bash: declare: 10#88f: value too great for base (error token is "10#88f")

In addition to being really annoying (you can’t use || to get around it) it is also wrong. It isn’t a matter of base but an invalid value.

#!/bin/bash

function to_int {
    local -i num="10#${1}"
    echo "${num}"
}

function port_is_ok {
    local port="$1"
    local -i port_num=$(to_int "${port}" 2>/dev/null)

    if (( $port_num < 1 || $port_num > 65535 )) ; then
        echo "*** ${port} is not a valid port" 1>&2
        return
    fi

    echo 'ok'
}

port_is_ok 1          # => ok
port_is_ok 20         # => ok
port_is_ok 70000      # => *** 70000 is not a valid port
port_is_ok tnenth2    # => *** tnenth2 is not a valid port
port_is_ok thethe     # => *** thethe is not a valid port
port_is_ok 888f88     # => *** 888f88 is not a valid port
port_is_ok 88888f     # => *** 88888f is not a valid port

# EOF

Without the to_int() function, then you’d get errors from port_is_ok and the function would abort before it gets to the check.

You have to redirect stderr to hide this bash error.

This was tested with bash 4.1.5(1)-release

Ciao!

This entry was posted in My Projects and tagged , , . Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.

Post a Comment

Your email is never published nor shared. Required fields are marked *

*
*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Subscribe without commenting