Hur använder jag jämförelseoperatörer i bash? [duplicera]

<å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

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ån ksh) gör aritmetisk jämförelse. arg1 och num1 refererar här till skalvariablerna med samma namn. Varje variabel tolkas som en aritmetisk expansion och resultatet ersätts. Här om $arg1 är 010 och $num1 är 4+5, resultatet blir false (kommandot ((...)) kommer att återvända med utgångsstatus som inte är noll), eftersom 010 är oktalt för 8 och 4+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 var 2), skulle det tidigare kommandot misslyckas eftersom (2 och 2) 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 exempel a=2+2; echo "$((3 * $a))" med a=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änder strcoll() 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 som expr operatorer) eller awk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1" är standardkommandona för att göra strängjämförelse med strcoll().

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *