É uma das coisas como [[ .. ]]
é especial no Bash. [[ a -eq b ]]
forces a
e b
a serem tomadas como expressões aritméticas, e dentro de uma, uma string é tomada como o nome de uma variável. Outras expressões também funcionam, então você pode fazer isso:
$ a=2
$ [[ a -eq 1+1 ]] && echo yes
yes
Por outro lado, [
é um comando comum e obedece à mesma sintaxe dos comandos normais. Pode até ser implementado como um binário externo. Aqui, [
apenas verá a
e reclamará que não é realmente um inteiro.
$ [ a -eq 2 ] && echo yes
bash: [: a: integer expression expected
$ /usr/bin/[ a -eq 2 ] && echo yes
/usr/bin/[: invalid integer ‘a’
Use apenas algo como
a=asdf
if [[ $a = *[^0-9]* ]]; then
echo "'$a' isn't an integer"
fi
ou
a=asdf
case "$a" in
*[^0-9]*) echo "'$a' isn't an integer";;
esac
Aparentemente, ksh
faz a avaliação aritmética de a
e 1+1
, mesmo em [ a -eq 1+1 ]
.