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,
-equtasítja abasht, hogy a karakterláncokat egész számként értelmezze (0figyelmezteté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; fibash: [: 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, mert010oktá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),exprvan ilyen operátora, bár megteszi ar számtani összehasonlítás, ha az argumentumokat számként ismerjük fel (expr 01 '>=' 1true értéket ad vissza,expr X01 '>=' X1hamis é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 (egykshfunkciót abashészshváltozatokkal).
[ $UID -eq 0 ], nem pedig[ $UID -eq 0].