Esta pergunta já tem respostas aqui :
Comentários
- stackoverflow.com/ a / 18668580/1032785
Resposta
Esses operadores são usados em, por exemplo, (( ... ))
e $(( ... ))
( avaliação aritmética e expansão aritmética respectivamente):
if (( arg1 >= num1 )) && (( arg2 <= num2 )); then ... fi
E também com let
. O seguinte é equivalente ao acima:
if let "arg1 >= num1" && let "arg2 <= num2"; then ... fi
Veja a seção chamada “AVALIAÇÃO ARITMÉTICA” no manual do Bash.
Resposta
Em bash
especificamente:
-
((arg1 >= num1))
(herdado deksh
) faz comparação aritmética.arg1
enum1
aqui se referem às variáveis de shell de mesmo nome. Cada variável é interpretada como uma expansão aritmética e o resultado é substituído. Aqui, se$arg1
for010
e$num1
for4+5
, o resultado será falso (o comando((...))
retornará com um status de saída diferente de zero), porque010
é octal para 8 e4+5
é 9. -
(($arg1 >= $num1))
: o mesmo que acima, exceto que$arg1
e$num1
são expandidos antes que toda a expressão aritmética seja avaliada. Se$arg1
era(2
e$num1
era2)
, o comando anterior teria falhado porque(2
e2)
não são expressões válidas por si mesmas. Mas aqui teria sucesso porque(2 >= 2)
seria a expressão aritmética sendo avaliada. Geralmente, em expressões aritméticas, é “melhor deixar o$
de fora. Compare, por exemplo,a=2+2; echo "$((3 * $a))"
coma=2+2; echo "$((3 * a))"
. -
let "..."
(também de ksh). O mesmo que((...))
exceto que “s analisado como um comando normal, é menos legível, é pouco portátil e você precisa prestar mais atenção nas citações. -
[ "$arg1" -ge "$num1" ]
. Isso é padrão e portátil. Apenas constantes decimais são suportadas.[ 010 -ge 9 ]
é o mesmo que[ 10 -ge 9 ]
. -
[[ $arg1 -ge $num1 ]]
. Também do ksh, mas com grandes diferenças. Desta vez,$arg1
e$num1
são considerados como expressões aritméticas e não apenas constantes decimais.[[ 010 -ge 9 ]]
retorna falso novamente. -
[[ $arg1 < $num1 ]]
. Comparação de strings. Isso usastrcoll()
para comparar strings, então usando o algoritmo de classificação no local. Observe que enquanto<
e>
use o algoritmo de classificação,=
/==
faça a comparação byte a byte, então pode haver pares de strings para os quais tudo de<
,>
e=
/==
retorna falso.<=
e>=
não são suportados. -
[ "$arg1" "<" "$num1" ]
. Fora do padrão. O mesmo que acima, mas usando o comando[
.<
precisa ser citado para “não ser tomado como um operador de redirecionamento. -
expr " $arg1" "<=" " $num1" > /dev/null
(observe o espaços para forçar a comparação lexical e evitar problemas com strings parecidas comexpr
operadores) ouawk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1"
são os comandos padrão para fazer comparação de strings usandostrcoll()
.