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,-gte-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?