Estou fazendo uma comparação de números inteiros no bash (tentando ver se o usuário está executando como root) e encontrei duas maneiras diferentes de fazer isso:
O dobro é igual a:
if [ $UID == 0 ]
then
fi
-eq
if [ $UID -eq 0 ]
then
fi
Eu entendo que não há> = ou <= no bash, apenas -ge e -le, então por que existe um ==
se houver um -eq
?
Existe alguma diferença na maneira como compara os dois lados?
bash
shell
arithmetic
beatgammit
fonte
fonte
[ $UID -eq 0 ]
não[ $UID -eq 0]
.Respostas:
==
é umbash
alias específico para=
, que executa uma comparação de sequência (lexical) em vez da-eq
comparação numérica. (É o contrário do Perl: os operadores de estilo de palavra são numéricos, os simbólicos, lexicais.)fonte
-eq
indicabash
para interpretar as strings como números inteiros (produzindo0
sem aviso se a string não for numérica).[ 01 -eq 1 ]
mas[ 01 != 1 ]
.==
como um[
operador não é padrão e não deve ser usado, ele não é específico da festa . Foi introduzido pelo ksh e também é suportado pelo zsh (embora o primeiro=
precise ser citado), pelo yash e pelo[
utilitário GNU (e quaisquer utilitários implementados como scripts ksh em alguns sistemas) pelo menos).$ if [ "hello" -eq 0 ]; then echo true; fi
bash: [: Olá: expressão inteira esperadoPara elaborar a resposta de bollovan ...
Não há operador de comparação
>=
ou<=
para seqüências de caracteres. 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 string (
==
,!=
,<
,>
, mas não=
) para comparar inteiros se você usá-los para dentro((...))
.Exemplos
[[ 01 -eq 1 ]]
e(( 01 == 1 ))
fazem comparações inteiras. Ambos são verdadeiros.[[ 01 == 1 ]]
e[ 01 = 1 ]
fazem comparações de strings. Ambos são falsos.(( 01 -eq 1 ))
e(( 01 = 1 ))
retornará um erro.Nota: A sintaxe de colchete duplo
[[...]]
e a sintaxe de parênteses duplos((...))
não são suportadas por todos os shells.fonte
mksh
/zsh
(exceto no modo POSIX (embora esse não seja um recurso POSIX))),(( 010 == 10 ))
retornaria false porque010
seria tratado como um número octal (8 em decimal).test
/[
implementações não tem>=
/<=
operadores (yash
's[
tem embora),expr
tem tais operadores, que ele vai fazer a comparação aritmética se os argumentos são reconhecidos como números (expr 01 '>=' 1
retornar true,expr X01 '>=' X1
retorna falso).Se você quiser fazer uma comparação inteira, usará melhor (()), onde também poderá usar> = etc.
Exemplo:
fonte
(( UID == 0 ))
ou(( ! UID ))
para esse assunto. Observe que isso((...))
não é padrão (umksh
recurso também suportado porbash
ezsh
com variações).