Deze vraag heeft hier al antwoorden :
Reacties
- stackoverflow.com/ a / 18668580/1032785
Answer
Deze operator wordt bijvoorbeeld gebruikt in (( ... )) en $(( ... )) (respectievelijk rekenkundige evaluatie en rekenkundige uitbreiding ):
if (( arg1 >= num1 )) && (( arg2 <= num2 )); then ... fi
En ook met let. Het volgende is equivalent aan het bovenstaande:
if let "arg1 >= num1" && let "arg2 <= num2"; then ... fi
Zie de sectie met de naam “ARITHMETIC EVALUATION” in de Bash-handleiding.
Antwoord
In bash specifiek:
-
((arg1 >= num1))(overgenomen vanksh) doet rekenkundige vergelijking.arg1ennum1verwijzen hier naar de shell-variabelen met dezelfde naam. Elke variabele wordt geïnterpreteerd als een rekenkundige uitbreiding en het resultaat wordt vervangen. Hier als$arg1010is en$num14+5, het resultaat is false (de((...))-opdracht zal terugkeren met een exitstatus anders dan nul), omdat010is octaal voor 8 en4+5is 9. -
(($arg1 >= $num1)): hetzelfde als hierboven behalve dat$arg1en$num1worden uitgebreid voordat die hele rekenkundige uitdrukking wordt geëvalueerd. Als$arg1(2was en$num12), zou het vorige commando zijn mislukt omdat(2en2)op zichzelf geen geldige uitdrukkingen zijn. Maar hier zou het lukken omdat(2 >= 2)de rekenkundige uitdrukking zou zijn die wordt geëvalueerd. Over het algemeen is het binnen rekenkundige uitdrukkingen “beter om de$weg te laten. Vergelijk bijvoorbeelda=2+2; echo "$((3 * $a))"meta=2+2; echo "$((3 * a))". -
let "..."(ook van ksh). Zelfde als((...))behalve dat het “s geparseerd als een normaal commando, is minder leesbaar, is even weinig draagbaar en je moet meer aandacht besteden aan citaten. -
[ "$arg1" -ge "$num1" ]. Dat is standaard en draagbaar. Alleen decimale constanten worden ondersteund.[ 010 -ge 9 ]is hetzelfde als[ 10 -ge 9 ]. -
[[ $arg1 -ge $num1 ]]. Ook van ksh maar met grote verschillen. Deze keer worden$arg1en$num1beschouwd als rekenkundige uitdrukkingen en niet alleen als decimale constanten.[[ 010 -ge 9 ]]retourneert opnieuw false. -
[[ $arg1 < $num1 ]]. Stringvergelijking. Dat gebruiktstrcoll()om strings te vergelijken, dus gebruik het sorteeralgoritme in de landinstelling. Houd er rekening mee dat terwijl<en>gebruik het sorteeralgoritme,=/==vergelijk byte-naar-byte, dus er kunnen paren strings zijn waarvoor allemaal<,>en=/==retourneert false.<=en>=worden niet ondersteund. -
[ "$arg1" "<" "$num1" ]. Niet standaard. Hetzelfde als hierboven, maar met de opdracht[.<moet tussen aanhalingstekens worden geplaatst, zodat deze “niet wordt beschouwd als een omleidingsoperator. -
expr " $arg1" "<=" " $num1" > /dev/null(let op de ingesloten spaties om lexicale vergelijking te forceren en problemen te voorkomen met strings die eruit zien alsexproperators) ofawk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1"zijn de standaardopdrachten om stringvergelijking uit te voeren metstrcoll().