É 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 ] .