[ "$exit_status" -eq 0 ]
está correto se $ exit_status contiver apenas dígitos, e você pode remover as aspas (contanto que o IFS não contenha dígitos).
Se x estiver vazio ou não definido, [ "$x" -eq 6 ]
resultará em um erro, mas [[ "$x" -eq 6 ]]
não:
$ x=; [ "$x" -eq 6 ]
-bash: [: : integer expression expected
$ unset x; [ "$x" -eq 6 ]
-bash: [: : integer expression expected
$ x=; [[ "$x" -eq 6 ]]
$ unset x; [[ "$x" -eq 6 ]]
$
Operadores aritméticos retiram espaço em branco:
$ [ '6 ' -eq $'\n\t6' ]; echo $?
0
Dentro de [[os operandos dos operadores aritméticos são expressões aritméticas, por exemplo, [[ 4 -eq 2+2 ]]
é verdadeiro. Os números que começam com 0 são tratados como números octal:
$ [[ 010 -eq 8 ]]; echo $?
0
$ [ 010 -eq 8 ]; echo $?
1
Eu costumo usar = / == mesmo para comparar inteiros. = e == são equivalentes em bash dentro de ambos [[e [. == e [[não são definidos por POSIX.
A divisão de palavras e a expansão do nome de caminho não são realizadas dentro de [[. [[ $x = $y ]]
trata y como um padrão, mas [[ $x = "$y" ]]
trata y literalmente:
$ x=44; y='4*'
$ [[ $x = $y ]]; echo $?
0
$ [[ $x = "$y" ]]; echo $?
1