<å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.arg1
ochnum1
refererar här till skalvariablerna med samma namn. Varje variabel tolkas som en aritmetisk expansion och resultatet ersätts. Här om$arg1
är010
och$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$arg1
och$num1
utvidgas innan hela det aritmetiska uttrycket utvärderas. Om$arg1
var(2
och$num1
var2)
, skulle det tidigare kommandot misslyckas eftersom(2
och2)
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$arg1
och$num1
som 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 somexpr
operatorer) ellerawk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1"
är standardkommandona för att göra strängjämförelse medstrcoll()
.