Je fais une comparaison dentiers dans bash (en essayant de voir si lutilisateur sexécute en tant que root), et jai trouvé deux différents façons de le faire:
Double égale:
if [ $UID == 0 ] then fi
-eq
if [ $UID -eq 0 ] then fi
Je comprends quil ny a « s no> = ou < = dans bash, que -ge et -le, alors pourquoi y a-t-il un ==
sil y a « sa -eq
?
Y a-t-il une différence dans la façon dont il compare les deux côtés?
Commentaires
Réponse
==
est un bash
– alias spécifique pour =
, qui effectue une comparaison de chaînes (lexicale) au lieu de la comparaison numérique -eq
. (Cest à lenvers de Perl: les opérateurs de style mot sont numériques, les symboliques lexicaux.)
Commentaires
- Cela signifie-t-il que si les deux côtés sont des entiers, il convertit les deux côtés en chaînes et les compare ensuite?
- Plus précisément, ' est linverse: tout est une chaîne,
-eq
dit àbash
dinterpréter les chaînes comme des entiers (produisant0
sans avertissement si une chaîne isn ' t numeric). - @tjameson Pour donner un exemple:
[ 01 -eq 1 ]
mais[ 01 != 1 ]
. - Notez que si
==
en tant quopérateur[
nest pas standard et devrait ne 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 lutilitaire GNU[
( et tous les utilitaires implémentés en tant que scripts ksh sur certains systèmes) au moins). - @geekosaur Je reçois un avertissement de bash v4.3.42 si ma chaîne nest pas ' t numeric:
$ if [ "hello" -eq 0 ]; then echo true; fi
bash: [: hello: expression entière attendue
Réponse
Pour élaborer sur la réponse de bollovan « …
Il ny a pas de >=
ou <=
opérateur de comparaison pour les chaînes. Mais vous pouvez les utiliser avec la commande arithmétique ((...))
pour comparer des entiers.
Vous pouvez également utiliser les autres opérateurs de comparaison de chaînes (==
, !=
, <
, >
, mais pas =
) pour comparer des entiers si vous les utilisez dans ((...))
.
Exemples
- Les deux
[[ 01 -eq 1 ]]
et(( 01 == 1 ))
font un entier comparaisons. Les deux sont vrais. - Les deux
[[ 01 == 1 ]]
et[ 01 = 1 ]
font des comparaisons de chaînes. Les deux sont faux. - Les deux
(( 01 -eq 1 ))
et(( 01 = 1 ))
renverront une erreur.
Remarque: La syntaxe des doubles crochets [[...]]
et la syntaxe des doubles parenthèses ((...))
ne sont pas prises en charge par tous les shells.
Commentaires
- Notez que (sauf pour
mksh
/zsh
(sauf en mode POSIX (bien que ' ne soit pas une fonctionnalité POSIX))),(( 010 == 10 ))
renverrait false car010
serait traité comme un nombre octal (8 en décimal). - Notez que la plupart des
test
/[
implémentations don ' t ont des opérateurs>=
/<=
(yash
' s[
a cependant),expr
a de tels opérateurs, mais il fera ar comparaison ithmétique si les arguments sont reconnus comme des nombres (expr 01 '>=' 1
renvoie true,expr X01 '>=' X1
renvoie false).
Réponse
Si vous voulez faire une comparaison dentiers, vous utiliserez mieux (()), où vous pouvez également utiliser> = etc.
Exemple:
if (( $UID == 0 )); then echo "You are root" else echo "You are not root" fi
Commentaires
- Ou
(( UID == 0 ))
ou(( ! UID ))
pour cela compte. Notez que((...))
nest pas standard (une fonctionnalitéksh
également prise en charge parbash
etzsh
avec des variantes).
[ $UID -eq 0 ]
, pas[ $UID -eq 0]
.