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
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,
-eqverteltbashom de strings als gehele getallen te interpreteren (waardoor0zonder 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; fibash: [: 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 omdat010zou 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),exprheeft zulke operators, hoewel het ar zal doen ithmetische vergelijking als de argumenten worden herkend als getallen (expr 01 '>=' 1geeft true terug,expr X01 '>=' X1geeft 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 (eenkshfunctie die ook wordt ondersteund doorbashenzshmet variaties).
[ $UID -eq 0 ], niet[ $UID -eq 0].