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.arg1
ognum1
refererer her til skallvariablene med samme navn. Hver variabel tolkes som en aritmetisk utvidelse og resultatet erstattes. Her hvis$arg1
er010
og$num1
er4+5
, blir resultatet false (((...))
-kommandoen vil returnere med en utgangsstatus som ikke er null), fordi010
er oktalt for 8 og4+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
var2)
, ville den forrige kommandoen mislyktes fordi(2
og2)
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$arg1
og$num1
ansett 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 somexpr
operatorer) ellerawk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1"
er standardkommandoene for å gjøre strengesammenligning ved hjelp avstrcoll()
.