Dette spørsmålet har allerede svar her :
Kommentarer
- stackoverflow.com/ a / 18668580/1032785
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 fraksh) gjør sammenligning.arg1ognum1refererer her til skallvariablene med samme navn. Hver variabel tolkes som en aritmetisk utvidelse og resultatet erstattes. Her hvis$arg1er010og$num1er4+5, blir resultatet false (((...))-kommandoen vil returnere med en utgangsstatus som ikke er null), fordi010er oktalt for 8 og4+5er 9. -
(($arg1 >= $num1)): samme som ovenfor bortsett fra at$arg1og$num1utvides før hele det aritmetiske uttrykket blir evaluert. Hvis$arg1var(2og$num1var2), ville den forrige kommandoen mislyktes fordi(2og2)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 eksempela=2+2; echo "$((3 * $a))"meda=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$arg1og$num1ansett som aritmetiske uttrykk og ikke bare desimalkonstanter.[[ 010 -ge 9 ]]returnerer falsk igjen. -
[[ $arg1 < $num1 ]]. Sammenligning av streng. Som brukerstrcoll()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 somexproperatorer) ellerawk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1"er standardkommandoene for å gjøre strengesammenligning ved hjelp avstrcoll().