Egész számok összehasonlítása: számtani kifejezés vagy feltételes kifejezés

A Bash-ban két egész szám összehasonlítható feltételes kifejezéssel

arg1 OP arg2

Az OP a -eq, -ne, -lt, -le, -gt, vagy -ge. Ezek az aritmetikai bináris operátorok igazak, ha az arg1 egyenlő, nem egyenlő, kisebb, kisebb vagy egyenlő, nagyobb vagy nagyobb vagy egyenlő arg2 , illetőleg. Az Arg1 és az arg2 pozitív vagy negatív egész szám lehet.

vagy számtani kifejezés:

<= >= < > összehasonlítás

== != egyenlőség és egyenlőtlenség

Miért van két különböző módszerünk két egész szám összehasonlítására? Melyiket mikor kell használni?

Például a [[ 3 -lt 2 ]] feltételes kifejezést, az (( 3 < 2 )) pedig aritmetikai kifejezést használ. Mindkettő 0-t ad, ha az összehasonlítás igaz.

Két egész szám összehasonlításakor mindig használható-e ez a két módszer felcserélhető módon? Ha igen, miért van Bash-nek két módszere, nem pedig egy?

Megjegyzések

  • = != < <= > >= hasonlítsa össze a karakterláncokat . 1 -eq 01 de 1 != 01 és 8 -lt 42 de 8 > 42
  • Túl vannak terhelve aritmetikai kifejezésekben.
  • Önnek ‘ meg kell keresnie a bash váltónaplóiban, hogy megtudja, mikor voltak az egyes jellemzők – tette hozzá. Gyanítom, hogy az aritmetikai kifejezéseket sokkal később adták hozzá, mint a tesztparancs.
  • Nem a húrok összehasonlításával foglalkozom. @muru.

Válasz

Igen, két különböző módon lehet összehasonlítani két egész számot.

Úgy tűnik, hogy ezeket a tényeket nem fogadják el széles körben ezen a fórumon:

  1. Az idióma belsejében -eq, -ne, -lt, -le, -gt és -ge.

    Mivel egy tesztparancsban és egy [[ ]].

    Ezen idiómákon belül igen, =, < stb. karakterlánc operátorok.

  2. Az idióma belsejében (( )) az aritmetikai összehasonlítás operátorai: == , !=, <, <=, >, és >=.

    Nem, ez nem “Arithm” etic expand “(amelyek $ -vel kezdődnek) $(( )) néven. “Összetett parancsként” van meghatározva a man bash-ban.

    Igen, ugyanazokat a (belső) szabályokat követi az “Aritmetikai bővítés”, de nincs kimenete, csak kilépési értéke van. Így használható:

if (( 2 > 1 )); then ... 

Miért van kétféle módunk két egész szám összehasonlítására?

Gondolom, hogy az utóbbit (( )) az aritmetikai tesztek egyszerűbb végrehajtási módjaként fejlesztették ki. Szinte ugyanaz, mint a $(( )), de csak nincs kimenete.

Miért kettő? Nos, ugyanaz, mint miért van két printf (külső és beépített) vagy négy teszt (külső test, beépített , [ és [[). Így nőnek a héjak, javítva egy területet egy év alatt, másikat javítva a következő évben.

Melyiket mikor kell használni?

Ez nagyon nehéz kérdés, mert nem lehet hatékony különbség. Természetesen van némi különbség a [ ] mű és a (( )) belső működésében, de: melyik a jobb két egész szám összehasonlításához? Bárki!

Két egész szám összehasonlításakor mindig használható-e ez a két módszer felváltva?

Két szám esetén kénytelen vagyok igent mondani.
De változók, kibővítések esetén , matematikai műveletek lehetnek olyan kulcsfontosságú különbségek, amelyeknek egyiknek vagy másiknak kell kedveznie. Nem mondhatom, hogy abszolút mindkettő egyenlő. Az egyik esetében a (( )) több matematikai műveletet hajthat végre egymás után:

if (( a=1, b=2, c=a+b*b )); then echo "$c"; fi 

Ha igen, miért van Bash két módszer helyett egy?

Ha mindkettő hasznos, miért ne?

Megjegyzések

  • egy hozzárendelés, a == pedig az aritmetikai kiterjesztések összehasonlítása. A kérdés helyesen idézi. De a válasz téves.
  • Szintén a ( nem fenntartott szó a bash-ban, ezért nem kell szóközt elhelyezni a (( körül, mivel [ vagy [[

Válasz

Történelmileg a test parancs létezett először (legalábbis a Unix hetedik kiadásáig 1979-ben). A = és a != operátorokat használta a karakterláncok összehasonlításához, valamint a -eq, -ne, -lt stb. A számok összehasonlításához. Például a test 0 = 00 hamis, de a test 0 -eq 00 igaz. Nem tudom, miért választották ezt a szintaxist, de lehet, hogy elkerülte a < és az > átirányítási operátorokként értelmezve. A test parancs néhány évvel később újabb szintaxist kapott: [ … ] egyenértékű a test ….

A [[ … ]] feltételes szintaxis, amelyen belül < és > idézőjelek nélkül használható operátorként, később került hozzáadásra a ksh-ben. Visszafelé kompatibilis maradt a [ … ] -vel, ezért ugyanazokat az operátorokat használta, de hozzáadta a < és > a karaktersorozatok összehasonlításához (például [[ 9 > 10 ]], de [[ 9 -lt 10 ]]

egy- vagy dupla zárójel használatával – bash

Az aritmetikai kifejezések is később érkeztek, mint a test parancs, a Korn-héjban , valamikor az 1980-as években. Követték a C nyelv szintaxisát, amely nagyon népszerű volt a Unix körökben. Így C “operátorokat használtak: == az egyenlőséghez, <= a kisebb-egyenlő stb. > A Unix hetedik kiadásának nem volt aritmetikai kifejezése, de a expr parancs volt, amely egy C-szerű szintaxis egész műveletekhez, beleértve annak összehasonlító operátorait is. Egy shell szkriptben a < és > karaktereket meg kellett idézni, hogy megvédjék őket a shelltől, pl. Az if expr 1 \< 2; … egyenértékű a if test 1 -lt 2; … értékkel. Az aritmetikai kifejezések hozzáadása a héjhoz a expr legtöbb felhasználását elavulttá tette, ezért ma még nem ismert.

Egy sh szkriptben Ön ” d általában számtani kifejezéseket használ egy egész szám kiszámításához, és [ … ] az egész számok összehasonlításához.

if [ "$((x + y))" -lt "$z" ]; then … 

Egy ksh-ban , bash vagy zsh szkript, használhatja a ((…)) elemet mindkettőhöz.

if ((x + y < z)); then … 

A űrlap akkor hasznos, ha feltételeket szeretne használni, amelyek nem egész számokat tartalmaznak.

Válasz

a teszt man oldalt, a = és! = karakterlánc-összehasonlításokra használják, míg az -eq, -gt, -lt, -ge, -le és -ne kifejezések egész összehasonlítások. Mindig követtem ezt a konvenciót, amikor shell szkripteket írtam, és ez mindig működik. Ne feledje, hogy ha vannak változók a kifejezésben, akkor a null összehasonlítás elkerülése érdekében valamilyen módon idéznie kell a változókat.

Papíron különféle gondolkodás nélkül végezzük a karakterláncok / számok összehasonlítását. A számítógép viszont nem tudja, hogy a 987 szám vagy karakterlánc. Szüksége van a különböző operátorokra, hogy megmondják a számítógépnek, hogy mit kell tennie, hogy a megfelelő eredményt érje el. Van néhány további információ itt , amely megmagyarázza az előzmények egy részét. Lényegében a változók nincsenek beírva, és így maradtak a történelmi kompatibilitás érdekében.

Megjegyzések

  • Bejegyzésemben = és a != számtani operátorok, míg az test kézikönyv csak feltételes kifejezés operátorokat mutat.

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