Bash: dupla egyenlő vs -eq

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

  • Vegye figyelembe, hogy a zárójelben belül szóközökre van szükség: [ $UID -eq 0 ], nem pedig [ $UID -eq 0].

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 a bash 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, mert 010 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 (egy ksh funkciót a bash és zsh változatokkal).

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük