Dentro de [[ .. ]]
, o operador =
é, na verdade, uma correspondência de padrões, portanto, [[ $1 != *[!0-9]* ]]
testa se o valor de $1
não corresponde ao padrão *[!0-9]*
.
Os padrões usados aqui são os mesmos para expansão de nome de arquivo, por isso *
corresponde a qualquer caractere e [abc]
de qualquer caractere entre colchetes e [!abc]
ou [^abc]
de qualquer caractere não entre parênteses (excluindo a inicial !
ou ^
). Na verdade, isso testa se $1
contiver algum caractere que não seja um dígito de 0
a 9
.
declare -i var
marcaria a variável var
como uma variável inteira: atribuições a ela seriam interpretadas como em um contexto aritmético, portanto declare -i a; a=3+5; echo $a;
produziria 8
. Mas você não pode usar isso em um parâmetro posicional, como $1
. Em vez disso, declare -i $1
usaria a string contida em $1
e usaria essa como um nome de variável. (Observe que não há $
em declare -i a
acima.)
Você não pode usar declare -i
para testar se algo é um número, já que as sequências no contexto aritmético são tomadas como variáveis nomes . Isso não é um erro: declare -i a; b=1+2; a=b; echo $a;
. Em vez disso, imprime 3
, que pode ou não ser o que você deseja.