Sim, temos duas maneiras diferentes de comparar dois inteiros.
Parece que esses fatos não são amplamente aceitos neste fórum:
-
Dentro do idioma
[ ]
, os operadores para comparação aritmética são-eq
,-ne
,-lt
,-le
,-gt
e-ge
.Como eles também estão dentro de um comando de teste e dentro de um
[[ ]]
.Sim, dentro desta expressão,
=
,<
, etc. são operadores de string. -
Dentro do idioma
(( ))
, os operadores para comparação aritmética são=
,!=
,<
,<=
,>
e>=
.Não, isso não é uma "expansão aritmética" (que começa com
$
) como$(( ))
. É definido como um "Comando Composto" no homem bash.Sim, segue as mesmas regras (internamente) da "Expansão aritmética", mas não tem saída, apenas um valor de saída. Poderia ser usado assim:
if (( 2 > 1 )); then ...
Por que temos duas maneiras diferentes de comparar dois inteiros?
Eu acho que o último (( ))
foi desenvolvido como uma forma mais simples de realizar testes aritméticos. É quase o mesmo que o $(( ))
, mas não tem saída.
Por que dois? Bem, da mesma forma que temos dois printf
(externos e internos) ou quatro testes (externos test
, internos test
, [
e [[
). É assim que as cascas crescem, melhorando algumas áreas em um ano, melhorando outras no ano seguinte.
Quando usar qual?
Essa é uma questão muito difícil, porque não deve haver diferença efetiva. É claro que existem algumas diferenças na maneira como [ ]
trabalham e (( ))
trabalham internamente, mas: qual é melhor para comparar dois inteiros? Qualquer um!
Ao comparar dois inteiros, esses dois métodos podem sempre ser usados de maneira intercambiável?
Por dois números, sou obrigado a dizer sim.
Mas, para variáveis, expansões, operações matemáticas, pode haver diferenças fundamentais que devem favorecer uma ou outra. Eu não posso dizer que absolutamente ambos são iguais. Por um lado, o (( ))
poderia executar várias operações matemáticas em sequência:
if (( a=1, b=2, c=a+b*b )); then echo "$c"; fi
Se sim, por que o Bash tem dois métodos em vez de um?
Se ambos forem úteis, por que não?