Erre a kérdésre már itt vannak válaszok :
megjegyzések
- stackoverflow.com/ a / 18668580/1032785
Válasz
Ezeket az operátorokat például a (( ... ))
és $(( ... ))
( aritmetikai értékelés és aritmetikai kiterjesztés ):
if (( arg1 >= num1 )) && (( arg2 <= num2 )); then ... fi
És a let
paranccsal is. A következők egyenértékűek a fentiekkel:
if let "arg1 >= num1" && let "arg2 <= num2"; then ... fi
Lásd a Bash kézikönyv “ARITMETIKAI ÉRTÉKELÉS” című szakaszát.
Válasz
A bash
részben:
-
((arg1 >= num1))
(ksh
-től örökölve) számtani összehasonlítást végez.arg1
ésnum1
itt az azonos nevű shell változókra utalnak. Minden változót számtani kiterjesztésként értelmezünk, és az eredményt helyettesítjük. Itt, ha$arg1
010
és$num1
4+5
, az eredmény hamis lesz (a((...))
parancs nullától eltérő kilépési állapottal tér vissza), mert010
oktális a 8-hoz, az4+5
pedig 9. -
(($arg1 >= $num1))
: ugyanaz, mint fent, kivéve A$arg1
és a$num1
kiterjesztésre kerül, mielőtt az egész aritmetikai kifejezést kiértékelnék. Ha$arg1
(2
és$num1
2)
, az előző parancs meghiúsult volna, mert a(2
és az2)
önmagukban nem érvényes kifejezések. De itt ez sikerülni fog, mert(2 >= 2)
lenne az értékelt aritmetikai kifejezés. Általában a számtani kifejezéseken belül jobb, ha a$
-t elhagyja. Hasonlítsa össze például aa=2+2; echo "$((3 * $a))"
elemet a . -
let "..."
(a ksh-ből is). Ugyanaz, mint a((...))
, kivéve, hogy “s értelmezve normál parancsként, kevésbé olvasható, kevésbé hordozható, és jobban oda kell figyelni az idézetekre. -
[ "$arg1" -ge "$num1" ]
. Ez szabványos és hordozható. Csak a tizedes állandók támogatottak.[ 010 -ge 9 ]
megegyezik a[ 10 -ge 9 ]
-
[[ $arg1 -ge $num1 ]]
. A ksh-ból is, de nagy eltérésekkel. Ezúttal$arg1
és$num1
tekinthetők meg számtani kifejezésekként, és nem csak tizedesállandókként. A[[ 010 -ge 9 ]]
ismét hamis értéket ad vissza. -
[[ $arg1 < $num1 ]]
. Karakterlánc-összehasonlítás.strcoll()
a karakterláncok összehasonlításához, tehát a terjesztési algoritmus használatával. Ne feledje, hogy míg<
és>
használja a rendezési algoritmust,=
/==
bájt-bájt összehasonlítást végez, így lehetnek olyan húrpárok, amelyekhez az összes<
,>
és=
/==
return false.<=
és>=
nem támogatottak. -
[ "$arg1" "<" "$num1" ]
. Nem szabványos. Ugyanaz, mint fent, de a[
parancsot használta. A<
-t idézni kell, így nem tekinthető átirányítási operátornak. -
expr " $arg1" "<=" " $num1" > /dev/null
(vegye figyelembe a beágyazottat szóközök a lexikai összehasonlítás kényszerítésére és aexpr
operátorokhoz hasonló karakterláncokkal vagy aawk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1"
karakterláncokkal kapcsolatos problémák elkerülésére szolgálnak a sztringek összehasonlításának normál parancsai astrcoll()
.