web-dev-qa-db-fra.com

Bash: double égal à -eq

Je fais une comparaison d'entiers en bash (en essayant de voir si l'utilisateur s'exécute 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 de> = ou <= dans bash, seulement -ge et -le, alors pourquoi y a-t-il un == S'il y a un -eq?

Y a-t-il une différence dans la façon dont il compare les deux côtés?

49
beatgammit

== est un alias spécifique à bash pour =, qui effectue une comparaison de chaînes (lexicale) au lieu de -eq comparaison numérique. (C'est à l'envers de Perl: les opérateurs de style Word sont numériques, les opérateurs symboliques lexicaux.)

55
geekosaur

Pour élaborer sur réponse de bollovan ...

Il n'y a pas >= ou <= opérateur de comparaison pour les chaînes. Mais vous pouvez les utiliser avec le ((...)) commande arithmétique pour comparer les entiers.

Vous pouvez également utiliser les autres opérateurs de comparaison de chaînes (==, !=, <, >, mais non =) pour comparer des entiers si vous les utilisez dans ((...)).

Exemples

  • Tous les deux [[ 01 -eq 1 ]] et (( 01 == 1 )) faire des comparaisons entières. Les deux sont vrais.
  • Tous les deux [[ 01 == 1 ]] et [ 01 = 1 ] faire des comparaisons de chaînes. Les deux sont faux.
  • Tous les deux (( 01 -eq 1 )) et (( 01 = 1 )) renverra une erreur.

Remarque: La syntaxe du double crochet [[...]] et la syntaxe des doubles parenthèses ((...)) ne sont pas pris en charge par tous les shells.

13
toxalot

Si vous voulez faire une comparaison entière, 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
7
bollovan