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.
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 -isince it spews errors and aborts functions if the input is malformed.An example:
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 # EOFWithout 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)-releaseCiao!