string e number comparsion no bash nas instruções de teste?

1

Não tenho certeza sobre essa comparação que estou fazendo:

   if [ "$exit_status" -eq 0 ];then
   #some statements
   fi

é essa maneira correta de comparar números ou citações para tornar a variável exit_status uma string para ser comparado com 0. Eu não sei se isso poderia falhar em algum cenário.

    
por munish 24.04.2013 / 14:40

3 respostas

2

[ "$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
    
por 24.04.2013 / 21:12
4

Sim, está correto.

Citações em shells são para finalidades diferentes de outras linguagens. Consulte esta resposta para obter mais detalhes.

No shell, aspas são usadas para impedir que o shell trate alguns caracteres especialmente e para impedir algumas operações que o shell executaria em alguns tipos de expansão (como, neste caso, a expansão de variáveis).

Normalmente, neste caso, você deseja que "$exit_status" seja expandido para um argumento para o comando [ que é o conteúdo dessa variável, então você precisa das aspas.

    
por 24.04.2013 / 14:52
-1

Citando números é de pouca utilidade embora. Se o valor do parâmetro for um número, as cotas não alteram nada e, se não for, o if irá falhar de qualquer maneira. OK, não em todos os casos:

exit_status="a = a -o 0"; [ "$exit_status" -eq 0 ] # returns false
exit_status="a = a -o 0"; [ $exit_status -eq 0 ] # returns true

Isso ocorre porque [ é um bash embutido, mas, mesmo assim, é um comando simples, enquanto [[ é um comando composto que altera a análise da linha de comando.

    
por 24.04.2013 / 15:09

Tags