Внутри [[.. ]]
оператор =
на самом деле является сопоставлением с шаблоном, поэтому [[ $1 != *[!0-9]* ]]
проверяет, не соответствует ли значение $1
шаблону *[!0-9]*
.
Шаблоны, используемые здесь, такие же, как и для расширения имени файла, поэтому *
соответствует любому символу, а [abc]
любому символу в квадратных скобках, а [!abc]
или [^abc]
любому символу , а не . ] в квадратных скобках (, за исключением начального !
или^
). По сути, это проверяет, содержит ли $1
некоторый символ, не являющийся цифрой, от 0
до 9
.
declare -i var
пометит переменную var
как целочисленную переменную, :присвоения ей будут интерпретироваться как в арифметическом контексте, поэтому declare -i a; a=3+5; echo $a;
выведет 8
. Но вы не можете использовать это для позиционного параметра, например $1
. Вместо этого declare -i $1
возьмет строку, содержащуюся в $1
, и использует , что , в качестве имени переменной. (Обратите внимание, что в declare -i a
выше нет $
.)
На самом деле вы не можете использовать declare -i
для проверки того, является ли что-то числом, поскольку строки в арифметическом контексте воспринимаются как имена переменных . Это не ошибка:declare -i a; b=1+2; a=b; echo $a;
. Вместо этого он печатает 3
, что может быть, а может и не быть тем, что вам нужно.
Не очень приятное объяснение вроде от ilkkachu
Но можно и так попробовать
[ ! -z $1 -a $1 -eq $1 ] 2>/dev/null && echo "integer $1" || echo "not integer $1"