Como usar operadores de comparação no bash? [duplicado]

1

Como posso usar <= , >= , > e < no bash?

Em vez de:

if [[ $arg1 -ge $num1 && $arg2 -le $num2 ]]; then
     ...
fi

Tem algo mais como:

if [[ $arg1 >= $num1 && $arg2 <= $num2 ]]; then
     ...
fi
    
por 14wml 20.03.2017 / 15:32

2 respostas

3

Estes operadores são utilizados, por exemplo, em (( ... )) 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.

    
por 20.03.2017 / 15:53
4

Em bash especificamente:

  • ((arg1 >= num1)) (herdado de ksh ) faz comparação aritmética. arg1 e num1 aqui referem-se às variáveis do shell com o mesmo nome. Cada variável é interpretada como uma expansão aritmética e o resultado é substituído. Aqui se $arg1 for 010 e $num1 for 4+5 , o resultado será falso (o comando ((...)) retornará com um status de saída diferente de zero), porque 010 é octal para 8 e 4+5 é 9.
  • (($arg1 >= $num1)) : igual ao acima, exceto que $arg1 e $num1 são expandidos antes que toda a expressão aritmética seja avaliada. Se $arg1 fosse (2 e $num1 fosse 2) , o comando anterior teria falhado porque (2 e 2) não são expressões válidas por conta própria. Mas aqui teria sucesso porque (2 >= 2) seria a expressão aritmética sendo avaliada. Geralmente, dentro de expressões aritméticas, é melhor deixar o $ out. Compare por exemplo a=2+2; echo "$((3 * $a))" com a=2+2; echo "$((3 * a))" .
  • let "..." (também do ksh). O mesmo que ((...)) , exceto que é analisado como um comando normal, é menos legível, é menos portável e você precisa prestar mais atenção à citação.
  • %código%. Isso é padrão e portátil. Apenas constantes decimais são suportadas. [ "$arg1" -ge "$num1" ] é o mesmo que [ 010 -ge 9 ] .
  • %código%. Também do ksh mas com grandes diferenças. Desta vez, [ 10 -ge 9 ] e [[ $arg1 -ge $num1 ]] são considerados expressões aritméticas e não apenas constantes decimais. $arg1 retorna falso novamente.
  • %código%. Comparação de seqüência. Isso usa $num1 para comparar strings, portanto, usando o algoritmo de classificação na localidade. Observe que, embora [[ 010 -ge 9 ]] e [[ $arg1 < $num1 ]] usem o algoritmo de classificação, strcoll() / < faça a comparação byte a byte, talvez haja pares de strings para os quais > , = e == / < return false. > e = não são suportados.
  • %código%. Não padronizado. O mesmo que acima, mas usando o comando == . <= precisa ser citado, por isso não é considerado um operador de redirecionamento.
  • >= (observe os espaços incorporados para forçar a comparação lexical e evitar problemas com sequências parecidas com [ "$arg1" "<" "$num1" ] operadores) ou [ são os comandos padrão para fazer a comparação de sequências usando < .
por 20.03.2017 / 17:13