Bash: double equals vs -eq

Ik doe vergelijking van gehele getallen in bash (ik probeer te zien of de gebruiker als root draait), en ik vond twee verschillende manieren om het te doen:

Dubbel is gelijk aan:

if [ $UID == 0 ] then fi 

-eq

if [ $UID -eq 0 ] then fi 

Ik begrijp dat er “s no> = of < = in bash, alleen -ge en -le, dus waarom is er een == if there “sa -eq?

Is er een verschil in de manier waarop het beide kanten vergelijkt?

Opmerkingen

  • Merk op dat spaties tussen haakjes vereist zijn: [ $UID -eq 0 ], niet [ $UID -eq 0].

Antwoord

== is een bash -specifieke alias voor =, die een string (lexicale) vergelijking uitvoert in plaats van de -eq numerieke vergelijking. (Het is achteruit van Perl: de operatoren in woordstijl zijn numeriek, de symbolische lexicaal.)

Opmerkingen

  • Betekent dit dat als beide zijden zijn gehele getallen, het converteert beide zijden naar strings en vergelijkt ze vervolgens?
  • Meer precies is het ' s andersom: alles is een string, -eq vertelt bash om de strings als gehele getallen te interpreteren (waardoor 0 zonder waarschuwing wordt isn ' t numeriek).
  • @tjameson Om een voorbeeld te geven: [ 01 -eq 1 ] maar [ 01 != 1 ].
  • Merk op dat terwijl == als een [ operator niet standaard is en zou moeten niet gebruikt, het is niet bash-specifiek . Het werd geïntroduceerd door ksh en wordt ook ondersteund door zsh (hoewel de eerste = moet worden geciteerd) , yash en het GNU [ hulpprogramma ( en al dergelijke hulpprogrammas geïmplementeerd als ksh-scripts op sommige systemen) tenminste).
  • @geekosaur Ik krijg een waarschuwing van bash v4.3.42 als mijn string niet ' is t numeriek: $ if [ "hello" -eq 0 ]; then echo true; fi bash: [: hallo: expressie van integer verwacht

Antwoord

Om uit te werken over het antwoord van bollovan “s antwoord

Er is geen >= of <= vergelijkingsoperator voor strings. Maar je zou ze kunnen gebruiken met het ((...)) rekenkundige commando om gehele getallen te vergelijken.

Je kunt ook de andere stringvergelijkingsoperatoren gebruiken (==, !=, <, >, maar niet =) om gehele getallen te vergelijken als u ze gebruikt binnen ((...)).

Voorbeelden

  • Zowel [[ 01 -eq 1 ]] als (( 01 == 1 )) doen een geheel getal vergelijkingen. Beide zijn waar.
  • Beide [[ 01 == 1 ]] en [ 01 = 1 ] doen stringvergelijkingen. Beide zijn onwaar.
  • Beide (( 01 -eq 1 )) en (( 01 = 1 )) retourneren een foutmelding.

Opmerking: de syntaxis met dubbele haakjes [[...]] en de syntaxis met dubbele haakjes ((...)) worden niet door alle shells ondersteund.

Reacties

  • Merk op dat (behalve mksh / zsh (behalve in POSIX-modus (hoewel ' geen POSIX-functie is))), zou (( 010 == 10 )) false retourneren omdat 010 zou worden behandeld als een octaal getal (8 in decimaal).
  • Merk op dat terwijl de meeste test / [ implementaties hebben geen ' geen >= / <= operators (yash ' s [ heeft echter), expr heeft zulke operators, hoewel het ar zal doen ithmetische vergelijking als de argumenten worden herkend als getallen (expr 01 '>=' 1 geeft true terug, expr X01 '>=' X1 geeft false terug).

Answer

Als je integer-vergelijking wilt doen, kun je beter (()) gebruiken, waar je ook> = enz. kunt gebruiken.

Voorbeeld:

if (( $UID == 0 )); then echo "You are root" else echo "You are not root" fi 

Reacties

  • Of (( UID == 0 )) of (( ! UID )) wat dat betreft. Merk op dat ((...)) niet-standaard is (een ksh functie die ook wordt ondersteund door bash en zsh met variaties).

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *