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
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:
-
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. -
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, ==
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 aztest
kézikönyv csak feltételes kifejezés operátorokat mutat.
= != < <= > >=
hasonlítsa össze a karakterláncokat .1 -eq 01
de1 != 01
és8 -lt 42
de8 > 42