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.arg1
ognum1
henviser her til shellvariablerne med samme navn. Hver variabel fortolkes som en aritmetisk udvidelse, og resultatet erstattes. Her hvis$arg1
er010
og$num1
er4+5
, resultatet bliver falsk (kommandoen((...))
vender tilbage med en status, der ikke er nul), fordi010
er oktal for 8 og4+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
var2)
, ville den forrige kommando mislykkedes, fordi(2
og2)
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$arg1
og$num1
som 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 lignerexpr
operatorer) ellerawk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1"
er standardkommandoerne til at udføre strengesammenligning ved hjælp afstrcoll()
.