Egész összehasonlítást végzek a bash-ban (próbálom megnézni, hogy a felhasználó rootként fut-e), és két különbözőt találtam ennek módjai:
Dupla egyenlő:
if [ $UID == 0 ] then fi
-eq
if [ $UID -eq 0 ] then fi
Megértem, hogy a bash-ban “s no> = vagy < = van, csak -ge és -le, miért van tehát ==
ha van “sa -eq
?
Van-e különbség a két oldal összehasonlításában?
Megjegyzések
Válasz
==
egy bash
-specifikus álnév a =
számára, amely string (lexikális) összehasonlítást hajt végre a -eq
numerikus összehasonlítás helyett. (Perlről hátra van: a szóstílus operátorai numerikusak, a szimbolikusak lexikálisak.)
Megjegyzések
- Ez azt jelenti, hogy ha mindkét oldal egész szám, mindkét oldalt karakterláncokká alakítja, majd összehasonlítja?
- Pontosabban ez ' s fordítva: minden egy karakterlánc,
-eq
utasítja abash
t, hogy a karakterláncokat egész számként értelmezze (0
figyelmeztetés nélkül, ha karakterlánc nem ' t numerikus). - @tjameson Például:
[ 01 -eq 1 ]
de[ 01 != 1 ]
. - Ne feledje, hogy míg
==
[
operátorként nem szabványos, ezért nem használható, nem bash-specifikus . A ksh vezette be, és a zsh is támogatja (bár az első=
-t idézni kell) , yash és a GNU[
segédprogram ( és minden ilyen segédprogram, amelyet egyes rendszereken ksh szkriptként hajtanak végre).) - @geekosaur figyelmeztetést kapok a bash v4.3.42 verzióról, ha a karakterláncom nem ' t numerikus:
$ if [ "hello" -eq 0 ]; then echo true; fi
bash: [: hello: egész kifejezés várható
válasz
A bollovan válaszának bővebb kifejtése …
Nincs >=
vagy <=
karakterláncok összehasonlító operátora. De felhasználhatja őket a ((...))
aritmetikai paranccsal az egész számok összehasonlításához.
Használhatja a többi karakterlánc-összehasonlító operátort is (==
, !=
, <
, >
, de nem =
) az egész számok összehasonlításához, ha az ((...))
belül használja őket.
Példák
-
[[ 01 -eq 1 ]]
és(( 01 == 1 ))
egész szám is összehasonlítások. Mindkettő igaz. - Mind a
[[ 01 == 1 ]]
, mind a[ 01 = 1 ]
karakterlánc-összehasonlítást végez. Mindkettő hamis. -
(( 01 -eq 1 ))
és(( 01 = 1 ))
is hibát eredményez.
Megjegyzés: A dupla zárójeles szintaxist [[...]]
és a dupla zárójeles szintaxist ((...))
nem minden héj támogatja.
Megjegyzések
- Ne feledje, hogy (kivéve:
mksh
/zsh
(kivéve POSIX módban (bár ' nem POSIX szolgáltatás)), a(( 010 == 10 ))
hamis értéket adna vissza, mert010
oktális számként kezelné (8 tizedesjegyben). - Ne feledje, hogy míg a legtöbb
test
/[
megvalósítások ne ' ne legyenek>=
/<=
operátorok (yash
' s[
van),expr
van ilyen operátora, bár megteszi ar számtani összehasonlítás, ha az argumentumokat számként ismerjük fel (expr 01 '>=' 1
true értéket ad vissza,expr X01 '>=' X1
hamis értéket ad vissza).
Válasz
Ha egész összehasonlítást akarsz végezni, akkor jobban használd a (()) parancsot, ahol használhatod a> = stb.
Példa:
if (( $UID == 0 )); then echo "You are root" else echo "You are not root" fi
Megjegyzések
- Vagy
(( UID == 0 ))
vagy(( ! UID ))
. Ne feledje, hogy az((...))
nem szabványos (egyksh
funkciót abash
észsh
változatokkal).
[ $UID -eq 0 ]
, nem pedig[ $UID -eq 0]
.