Hvordan bruke sammenligningsoperatører i bash? [duplikat]

Dette spørsmålet har allerede svar her :

Kommentarer

Svar

Disse operatorene brukes i f.eks. (( ... )) og $(( ... )) (henholdsvis aritmetisk evaluering og aritmetisk utvidelse ):

if (( arg1 >= num1 )) && (( arg2 <= num2 )); then ... fi 

Og også med let. Følgende tilsvarer ovenstående:

if let "arg1 >= num1" && let "arg2 <= num2"; then ... fi 

Se avsnittet «ARITMETISK EVALUERING» i Bash-håndboken.

Svar

I bash spesifikt:

  • ((arg1 >= num1)) (arvet fra ksh) gjør sammenligning. arg1 og num1 refererer her til skallvariablene med samme navn. Hver variabel tolkes som en aritmetisk utvidelse og resultatet erstattes. Her hvis $arg1 er 010 og $num1 er 4+5, blir resultatet false (((...)) -kommandoen vil returnere med en utgangsstatus som ikke er null), fordi 010 er oktalt for 8 og 4+5 er 9.
  • (($arg1 >= $num1)): samme som ovenfor bortsett fra at $arg1 og $num1 utvides før hele det aritmetiske uttrykket blir evaluert. Hvis $arg1 var (2 og $num1 var 2), ville den forrige kommandoen mislyktes fordi (2 og 2) ikke er gyldige uttrykk alene. Men her ville det lykkes fordi (2 >= 2) ville være det aritmetiske uttrykket som ble evaluert. Generelt, innen aritmetiske uttrykk, er det bedre å la $ være ute. Sammenlign for eksempel a=2+2; echo "$((3 * $a))" med a=2+2; echo "$((3 * a))".
  • let "..." (også fra ksh). Samme som ((...)) bortsett fra at det «s analysert som en vanlig kommando, er mindre leselig, er like lite bærbar og du må være nøye med å sitere.
  • [ "$arg1" -ge "$num1" ]. Det er standard og bærbart. Bare desimalkonstanter støttes. [ 010 -ge 9 ] er det samme som [ 10 -ge 9 ].
  • [[ $arg1 -ge $num1 ]]. Også fra ksh men med store forskjeller. Denne gangen blir $arg1 og $num1 ansett som aritmetiske uttrykk og ikke bare desimalkonstanter. [[ 010 -ge 9 ]] returnerer falsk igjen.
  • [[ $arg1 < $num1 ]]. Sammenligning av streng. Som bruker strcoll() for å sammenligne strenger, så bruk sorteringsalgoritmen i stedet. Merk at mens < og > bruk sorteringsalgoritmen, = / == sammenligne byte-til-byte, så det kan være par strenger som alle <, > og = / == returner falsk. <= og >= støttes ikke.
  • [ "$arg1" "<" "$num1" ]. Ikke-standard. Samme som ovenfor, men bruker kommandoen [. < må siteres slik at det ikke blir tatt som en viderekoblingsoperator.
  • expr " $arg1" "<=" " $num1" > /dev/null (merk den innebygde mellomrom for å tvinge leksikal sammenligning og unngå problemer med strenger som ser ut som expr operatorer) eller awk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1" er standardkommandoene for å gjøre strengesammenligning ved hjelp av strcoll().

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *