Bash: double égale vs -eq

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

  • Notez que les espaces entre crochets sont obligatoires: [ $UID -eq 0 ], pas [ $UID -eq 0].

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 (produisant 0 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 car 010 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 par bash et zsh avec des variantes).

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *