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,
-eq
diz abash
para interpretar as strings como inteiros (produzindo0
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 porque010
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 (umksh
recurso também compatível combash
ezsh
com variações).
[ $UID -eq 0 ]
, não[ $UID -eq 0]
.