Bash Integer Comparison [duplicado]

1

Durante a leitura de um guia de estilo bash, encontrei a seguinte diretriz:

Math / Integer Manipulation

Use ((...)) and $((...)).

a=5
b=4

# wrong
if [[ $a -gt $b ]]; then
    ...
fi

# right
if ((a > b)); then
    ...
fi

Quando perguntei sobre o raciocínio, foi-me dito que o teste [[ poderia sufocar tentando comparar números com zeros à esquerda. Nos meus testes, não consegui recriar esse problema.

Minha pergunta

Is there actually a functional difference between ((a > b)) and [[ "$a" -gt "$b" ]]?

    
por Jesse_b 22.12.2017 / 17:51

1 resposta

2

Não que eu possa ver.

Mas há uma diferença entre [[ val1 < val2 ]] e (( val1 < val2 )) : a primeira é uma comparação de string.

$ [[ 2 -lt 007 ]] && echo true || echo false
true
$ [[ 2 < 007 ]] && echo true || echo false
false
$ (( 2 < 007 )) && echo true || echo false
true

Embora zeros iniciais ainda sejam um problema em ambos os casos:

$ (( 20 < 021 )) && echo true || echo false
false
$ [[ 20 -lt 021 ]] && echo true || echo false
false

Isso porque eles marcam números octal, como em C. Mas você evita isso prefixando-os com 10# . ( Aritmética shell da Bash Reference 6.5 )

$ (( 10#20 < 10#021 )) && echo true || echo false
true
    
por 22.12.2017 / 18:07

Tags