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ésnum1itt 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$arg1010és$num14+5, az eredmény hamis lesz (a((...))parancs nullától eltérő kilépési állapottal tér vissza), mert010oktális a 8-hoz, az4+5pedig 9. -
(($arg1 >= $num1)): ugyanaz, mint fent, kivéve A$arg1és a$num1kiterjesztésre kerül, mielőtt az egész aritmetikai kifejezést kiértékelnék. Ha$arg1(2és$num12), 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$num1tekinthető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 aexproperá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().