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.arg1
ennum1
verwijzen hier naar de shell-variabelen met dezelfde naam. Elke variabele wordt geïnterpreteerd als een rekenkundige uitbreiding en het resultaat wordt vervangen. Hier als$arg1
010
is en$num1
4+5
, het resultaat is false (de((...))
-opdracht zal terugkeren met een exitstatus anders dan nul), omdat010
is octaal voor 8 en4+5
is 9. -
(($arg1 >= $num1))
: hetzelfde als hierboven behalve dat$arg1
en$num1
worden uitgebreid voordat die hele rekenkundige uitdrukking wordt geëvalueerd. Als$arg1
(2
was en$num1
2)
, zou het vorige commando zijn mislukt omdat(2
en2)
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$arg1
en$num1
beschouwd 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 alsexpr
operators) ofawk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1"
zijn de standaardopdrachten om stringvergelijking uit te voeren metstrcoll()
.