The accepted answer didn't work for me in all cases BASH 4+ so :
# -- is var an integer? --
# trim leading/trailing whitespace, then check for digits return 0 or 1
# Globals: None
# Arguments: string
# Returns: boolean
# --
is_int() {
str="$(echo -e "${1}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')"
case ${str} in ''|*[!0-9]*) return 1 ;; esac
return 0
}
How to use it ?
Valid (will return 0 = true):
is_int "100" && echo "return 0" || echo "return 1"
Invalid (will return 1 = false) :
is_int "100abc" && echo "returned 0" || echo "returned 1"
is_int "" && echo "returned 0" || echo "returned 1"
is_int "100 100" && echo "returned 0" || echo "returned 1"
is_int " " && echo "returned 0" || echo "returned 1"
is_int $NOT_SET_VAR && echo "returned 0" || echo "returned 1"
is_int "3.14" && echo "returned 0" || echo "returned 1"
Output:
returned 0
returned 1
returned 1
returned 1
returned 1
returned 1
returned 1
note, in Bash, 1 = false, 0 = true. I am simply printing it out where instead something like this would be more likely :
if is_int ${total} ; then
# perform some action
fi