Dette spørgsmål har allerede svar her :
Kommentarer
- stackoverflow.com/ a / 18668580/1032785
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 fraksh) foretager aritmetisk sammenligning.arg1ognum1henviser her til shellvariablerne med samme navn. Hver variabel fortolkes som en aritmetisk udvidelse, og resultatet erstattes. Her hvis$arg1er010og$num1er4+5, resultatet bliver falsk (kommandoen((...))vender tilbage med en status, der ikke er nul), fordi010er oktal for 8 og4+5er 9. -
(($arg1 >= $num1)): samme som ovenfor bortset fra at$arg1og$num1udvides inden hele det aritmetiske udtryk evalueres. Hvis$arg1var(2og$num1var2), ville den forrige kommando mislykkedes, fordi(2og2)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))"meda=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$arg1og$num1som aritmetiske udtryk og ikke kun decimalkonstanter.[[ 010 -ge 9 ]]returnerer falsk igen. -
[[ $arg1 < $num1 ]]. Sammenligning af strenge. Det brugerstrcoll()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 lignerexproperatorer) ellerawk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1"er standardkommandoerne til at udføre strengesammenligning ved hjælp afstrcoll().