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
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,
-eqdiz abashpara interpretar as strings como inteiros (produzindo0sem 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; fibash: [: 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 porque010seria 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),exprtem esses operadores, embora vá fazer comparação itmética se os argumentos forem reconhecidos como números (expr 01 '>=' 1retorna verdadeiro,expr X01 '>=' X1retorna 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 (umkshrecurso também compatível combashezshcom variações).
[ $UID -eq 0 ], não[ $UID -eq 0].