Bash: double equals vs -eq (Português)

Estou fazendo uma comparação de inteiros no bash (tentando ver se o usuário está executando como root) e encontrei dois diferentes maneiras de fazer isso:

Duplo é igual a:

if [ $UID == 0 ] then fi 

-eq

if [ $UID -eq 0 ] then fi 

Eu entendo que há “s não> = ou < = em bash, apenas -ge e -le, então por que há um == se houver “sa -eq?

Há alguma diferença na maneira como ele compara os dois lados?

Comentários

  • Observe que os espaços entre colchetes são obrigatórios: [ $UID -eq 0 ], não [ $UID -eq 0].

Resposta

== é uma bash -alias específico para =, que executa uma comparação de string (lexical) em vez da -eq comparação numérica. (É ao contrário do Perl: os operadores de estilo de palavra são numéricos, os simbólicos lexicais.)

Comentários

  • Isso significa que se ambos os lados são inteiros, ele converte ambos os lados em strings e depois os compara?
  • Mais precisamente, ' s o contrário: tudo é uma string, -eq diz a bash para interpretar as strings como inteiros (produzindo 0 sem um aviso se for uma string isn ' t numérico).
  • @tjameson Para dar um exemplo: [ 01 -eq 1 ] but [ 01 != 1 ].
  • Observe que, embora == como um operador [, não é padrão e deve não ser usado, não é específico do bash . Foi introduzido por ksh e também é compatível com zsh (embora o primeiro = precise ser citado) , yash e o utilitário GNU [ ( e quaisquer utilitários implementados como scripts ksh em alguns sistemas) pelo menos).
  • @geekosaur Recebo um aviso do bash v4.3.42 se minha string não for ' t numérico: $ if [ "hello" -eq 0 ]; then echo true; fi bash: [: hello: expressão inteira esperada

Resposta

Para elaborar sobre a resposta de bollovan “

Não há >= ou <= operador de comparação para strings. Mas você pode usá-los com o ((...)) comando aritmético para comparar números inteiros.

Você também pode usar os outros operadores de comparação de strings (==, !=, <, >, mas não =) para comparar números inteiros se você usá-los dentro de ((...)).

Exemplos

  • Ambos [[ 01 -eq 1 ]] e (( 01 == 1 )) fazem inteiro comparações. Ambos são verdadeiros.
  • Ambos [[ 01 == 1 ]] e [ 01 = 1 ] fazem comparações de strings. Ambos são falsos.
  • Ambos (( 01 -eq 1 )) e (( 01 = 1 )) retornarão um erro.

Observação: a sintaxe de colchetes duplos [[...]] e a sintaxe de parênteses duplos ((...)) não são compatíveis com todos os shells.

Comentários

  • Observe que (exceto para mksh / zsh (exceto no modo POSIX (embora ' não seja um recurso POSIX)), (( 010 == 10 )) retornaria falso porque 010 seria tratado como um número octal (8 em decimal).
  • Observe que, embora a maioria test / [ as implementações não têm ' t têm >= / <= operadores (yash ' s [ tem embora), expr tem esses operadores, embora vá fazer comparação itmética se os argumentos forem reconhecidos como números (expr 01 '>=' 1 retorna verdadeiro, expr X01 '>=' X1 retorna falso).

Resposta

Se você deseja fazer uma comparação de inteiros, é melhor usar (()), onde também pode usar> = etc.

Exemplo:

if (( $UID == 0 )); then echo "You are root" else echo "You are not root" fi 

Comentários

  • Ou (( UID == 0 )) ou (( ! UID )) para esse assunto. Observe que ((...)) não é padrão (um ksh recurso também compatível com bash e zsh com variações).

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *