Je suis en train de comparer des nombres entiers dans bash (en essayant de voir si l’utilisateur tourne en tant que root), et j’ai trouvé deux façons différentes de le faire:
Double égal:
if [ $UID == 0 ]
then
fi
-eq
if [ $UID -eq 0 ]
then
fi
Je comprends qu'il n'y a pas> = ou <= dans bash, seulement -ge et -le, alors pourquoi y en a ==
-t-il s'il y en a -eq
?
Y a-t-il une différence dans la façon de comparer les deux côtés?
bash
shell
arithmetic
beatgammit
la source
la source
[ $UID -eq 0 ]
pas[ $UID -eq 0]
.Réponses:
==
est unbash
alias spécifique pour=
, qui effectue une comparaison sous forme de chaîne (lexicale) au lieu d'une-eq
comparaison numérique. (C'est à l'envers de Perl: les opérateurs de style de mots sont numériques, les opérateurs symboliques lexicaux.)la source
-eq
ditbash
d'interpréter les chaînes comme des entiers (produire0
sans avertissement si une chaîne n'est pas numérique).[ 01 -eq 1 ]
but[ 01 != 1 ]
.==
qu’en tant[
qu’opérateur, il est non standard et ne doit pas être utilisé, il n’est pas spécifique à bash . Il a été introduit par ksh et est également pris en charge par zsh (bien que le premier=
doive être cité), yash et l’[
utilitaire GNU (et tout utilitaire de ce type implémenté sous forme de script ksh sur certains systèmes) au moins).$ if [ "hello" -eq 0 ]; then echo true; fi
bash: [: bonjour: expression entière attenduePour élaborer sur la réponse de Bollovan ...
Il n'y a pas d' opérateur
>=
ou d'<=
opérateur de comparaison pour les chaînes. Mais vous pouvez les utiliser avec la((...))
commande arithmétique pour comparer des nombres entiers.Vous pouvez également utiliser les autres opérateurs de comparaison de chaînes (
==
,!=
,<
,>
, mais pas=
) pour comparer les nombres entiers si vous les utiliser à l' intérieur((...))
.Exemples
[[ 01 -eq 1 ]]
et(( 01 == 1 ))
faire des comparaisons entier. Les deux sont vrais.[[ 01 == 1 ]]
et[ 01 = 1 ]
faire des comparaisons de chaînes. Les deux sont faux.(( 01 -eq 1 ))
et(( 01 = 1 ))
retournera une erreur.Remarque: La syntaxe double parenthèse
[[...]]
et la syntaxe double parenthèse((...))
ne sont pas prises en charge par tous les shells.la source
mksh
/zsh
(sauf en mode POSIX (bien que ce ne soit pas une fonctionnalité POSIX))),(( 010 == 10 ))
renvoie false, car010
serait traité comme un nombre octal (8 en décimal).test
/[
mises en œuvre n'ont pas>=
/<=
opérateurs (yash
« s[
a cependant),expr
a ces opérateurs, mais il fera la comparaison arithmétique si les arguments sont reconnus comme des nombres (expr 01 '>=' 1
rendements réels,expr X01 '>=' X1
fausses déclarations).Si vous voulez faire une comparaison d'entiers, vous ferez mieux d'utiliser (()), où vous pouvez aussi utiliser> = etc.
Exemple:
la source
(( UID == 0 ))
ou(( ! UID ))
pour que ça compte. Notez que ce((...))
n'est pas standard (uneksh
fonctionnalité également supportée parbash
etzsh
avec des variations).