<åt sidan class = "s-notice s-notice__info js-post-notice mb16" role = "status">
Den här frågan har redan svar här :
Kommentarer
- stackoverflow.com/ a / 18668580/1032785
Svar
Dessa operatörer används i t.ex. (( ... )) och $(( ... )) ( aritmetisk utvärdering respektive aritmetisk expansion ):
if (( arg1 >= num1 )) && (( arg2 <= num2 )); then ... fi
Och även med let. Följande motsvarar ovanstående:
if let "arg1 >= num1" && let "arg2 <= num2"; then ... fi
Se avsnittet ”ARITMETISK UTVÄRDERING” i Bash-handboken.
Svara
I bash specifikt:
-
((arg1 >= num1))(ärvt frånksh) gör aritmetisk jämförelse.arg1ochnum1refererar här till skalvariablerna med samma namn. Varje variabel tolkas som en aritmetisk expansion och resultatet ersätts. Här om$arg1är010och$num1är4+5, resultatet blir false (kommandot((...))kommer att återvända med utgångsstatus som inte är noll), eftersom010är oktalt för 8 och4+5är 9. -
(($arg1 >= $num1)): samma som ovan förutom att$arg1och$num1utvidgas innan hela det aritmetiska uttrycket utvärderas. Om$arg1var(2och$num1var2), skulle det tidigare kommandot misslyckas eftersom(2och2)inte är giltiga uttryck på egen hand. Men här skulle det lyckas eftersom(2 >= 2)skulle vara det aritmetiska uttrycket som utvärderas. Generellt, inom aritmetiska uttryck, är det bättre att lämna$. Jämför till exempela=2+2; echo "$((3 * $a))"meda=2+2; echo "$((3 * a))". -
let "..."(även från ksh). Samma som((...))förutom att det är analyseras som ett vanligt kommando, är mindre läsbart, är lika lite bärbart och du måste ägna mer uppmärksamhet åt att citera. -
[ "$arg1" -ge "$num1" ]. Det är standard och bärbart. Endast decimalkonstanter stöds.[ 010 -ge 9 ]är samma som[ 10 -ge 9 ]. -
[[ $arg1 -ge $num1 ]]. Även från ksh men med stora skillnader. Den här gången anses$arg1och$num1som aritmetiska uttryck och inte bara decimalkonstanter.[[ 010 -ge 9 ]]returnerar falskt igen. -
[[ $arg1 < $num1 ]]. Strängjämförelse. Den använderstrcoll()för att jämföra strängar, så använd sorteringsalgoritmen i den lokala. Observera att medan<och>använd sorteringsalgoritmen,=/==gör jämförelse mellan byte och byte, så det kan finnas par strängar för vilka alla<,>och=/==returnera falskt.<=och>=stöds inte. -
[ "$arg1" "<" "$num1" ]. Icke-standard. Samma som ovan men använder kommandot[.<måste citeras så att det inte tas som en omdirigeringsoperator. -
expr " $arg1" "<=" " $num1" > /dev/null(notera den inbäddade mellanslag för att tvinga lexikal jämförelse och undvika problem med strängar som ser ut somexproperatorer) ellerawk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1"är standardkommandona för att göra strängjämförelse medstrcoll().