Принятый ответ не работал для меня во всех случаях BASH 4+, поэтому:
# -- 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
}
Как это использовать?
Действительный (вернет 0 = true):
is_int "100" && echo "return 0" || echo "return 1"
Неверно (вернет 1 = ложь):
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"
Выход:
returned 0
returned 1
returned 1
returned 1
returned 1
returned 1
returned 1
примечание, в Bash, 1 = false, 0 = true. Я просто распечатываю это, где вместо этого было бы что-то подобное:
if is_int ${total} ; then
# perform some action
fi