Hvordan bruges sammenligningsoperatører i bash? [duplikat]

Dette spørgsmål har allerede svar her :

Kommentarer

Svar

Disse operatorer bruges i f.eks. (( ... )) og $(( ... )) (henholdsvis aritmetisk evaluering og aritmetisk udvidelse ):

if (( arg1 >= num1 )) && (( arg2 <= num2 )); then ... fi 

Og også med let. Følgende svarer til ovenstående:

if let "arg1 >= num1" && let "arg2 <= num2"; then ... fi 

Se afsnittet “ARITMETISK EVALUERING” i Bash-manualen.

Svar

I bash specifikt:

  • ((arg1 >= num1)) (nedarvet fra ksh) foretager aritmetisk sammenligning. arg1 og num1 henviser her til shellvariablerne med samme navn. Hver variabel fortolkes som en aritmetisk udvidelse, og resultatet erstattes. Her hvis $arg1 er 010 og $num1 er 4+5, resultatet bliver falsk (kommandoen ((...)) vender tilbage med en status, der ikke er nul), fordi 010 er oktal for 8 og 4+5 er 9.
  • (($arg1 >= $num1)): samme som ovenfor bortset fra at $arg1 og $num1 udvides inden hele det aritmetiske udtryk evalueres. Hvis $arg1 var (2 og $num1 var 2), ville den forrige kommando mislykkedes, fordi (2 og 2) ikke er gyldige udtryk alene. Men her ville det lykkes, fordi (2 >= 2) ville være det aritmetiske udtryk, der evalueres. Generelt inden for aritmetiske udtryk er det bedre at lade $ være ude. Sammenlign f.eks. a=2+2; echo "$((3 * $a))" med a=2+2; echo "$((3 * a))".
  • let "..." (også fra ksh). Samme som ((...)) bortset fra at det “s analyseret som en normal kommando, er mindre læselig, er så lidt bærbar, og du skal være opmærksom på at citere.
  • [ "$arg1" -ge "$num1" ]. Det er standard og bærbart. Kun decimalkonstanter understøttes. [ 010 -ge 9 ] er det samme som [ 10 -ge 9 ].
  • [[ $arg1 -ge $num1 ]]. Også fra ksh men med store forskelle. Denne gang betragtes $arg1 og $num1 som aritmetiske udtryk og ikke kun decimalkonstanter. [[ 010 -ge 9 ]] returnerer falsk igen.
  • [[ $arg1 < $num1 ]]. Sammenligning af strenge. Det bruger strcoll() for at sammenligne strenge, så brug sorteringsalgoritmen i det lokale. Bemærk at mens < og > brug sorteringsalgoritmen, = / == gør sammenligning af byte til byte, så der kan være par strenge, som alle <, > og = / == returner falsk. <= og >= understøttes ikke.
  • [ "$arg1" "<" "$num1" ]. Ikke standard. Samme som ovenfor, men ved hjælp af kommandoen [. < skal citeres, så det ikke tages som en omdirigeringsoperator.
  • expr " $arg1" "<=" " $num1" > /dev/null (bemærk den integrerede mellemrum for at tvinge leksikal sammenligning og undgå problemer med strenge, der ligner expr operatorer) eller awk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1" er standardkommandoerne til at udføre strengesammenligning ved hjælp af strcoll().

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *