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,
-eq
verteltbash
om de strings als gehele getallen te interpreteren (waardoor0
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 omdat010
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 (eenksh
functie die ook wordt ondersteund doorbash
enzsh
met variaties).
[ $UID -eq 0 ]
, niet[ $UID -eq 0]
.