bash: Checking a port number
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 with malformed input.
An example:
declare -i foo='10#88f'
bash: declare: 10#88f: value too great for base (error token is "10#88f")
It’s annoying (you can’t use ||
to get around it) and it’s 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!