Hogyan kell használni az összehasonlító operátorokat a bash-ban? [duplicate]

Erre a kérdésre már itt vannak válaszok :

megjegyzések

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 és num1 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), mert 010 oktális a 8-hoz, az 4+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 az 2) ö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 a a=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 a expr operátorokhoz hasonló karakterláncokkal vagy a awk "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 a strcoll().

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