/ bin / dash: проверьте, является ли $ 1 числом

Какой был бы лучший способ проверить, является ли $ 1 целым числом в / bin / dash?

В bash я мог бы сделать:

[[ $1 =~ ^([0-9]+)$ ]] 

Но это не похоже на совместимость с POSIX, и тире не поддерживается это

Следующие обнаруживают целые числа, положительные или отрицательные, и работают под dash и являются POSIX:

Опция 1

 echo "$1" | grep -Eq '^[+-]?[0-9]+$' && echo "It's an integer" 

Вариант 2

 case "${1#[+-]}" in ''|*[!0-9]*) echo "Not an integer" ;; *) echo "Integer" ;; esac 

Или, немного используя команду : (nop):

 ! case ${1#[+-]} in *[!0-9]*) :;; ?*) ! :;; esac && echo Integer 

Являются ли dash , bash , ksh , zsh , POSIX sh или posh ( «повторная реализация оболочки Bourne» sh ); конструкция case является наиболее широко доступной и надежной:

 case $1 in (*[!0-9]*|"") false ;; (*) true ;; esac 

Вы можете использовать -eq test в строке, с самим собой:

 $ dash -c 'a="a"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi' dash: 1: [: Illegal number: a not a number $ dash -c 'a="0xa"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi' dash: 1: [: Illegal number: 0xa not a number $ dash -c 'a="-1"; if [ "$a" -eq "$a" ] ; then echo number; else echo not a number; fi' number 

Если сообщение об ошибке является проблемой, перенаправление ошибки на /dev/null :

 $ dash -c 'a="0xa"; [ "$a" -eq "$a" ] 2>/dev/null|| echo no' no 

Попробуйте использовать его как арифметическое расширение и посмотрите, работает ли оно. На самом деле, вы должны быть немного более строгими, потому что арифметические расширения, например, игнорировали бы ведущие и конечные пробелы. Итак, сделайте арифметическое расширение и убедитесь, что расширенный результат точно соответствует исходной переменной.

 check_if_number() { if [ "$1" = "$((${1}))" ] 2>/dev/null; then echo "Number!" else echo "not a number" fi } 

Это также примет отрицательные числа – если вы действительно хотите их исключить, добавьте дополнительную проверку для $((${1} >= 0)) .

Возможно, с помощью expr ?

 if expr match "$1" '^\([0-9]\+\)$' > /dev/null; then echo "integer" else echo "non-integer" fi 

В системе POSIX вы можете использовать expr :

 $ a=a $ expr "$a" - 0 >/dev/null 2>&1 $ [ "$?" -lt 2 ] && echo Integer || echo Not Integer