Hoe vergelijkingsoperatoren te gebruiken in bash? [duplicate]

Deze vraag heeft hier al antwoorden :

Reacties

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 van ksh) doet rekenkundige vergelijking. arg1 en num1 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), omdat 010 is octaal voor 8 en 4+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 en 2) 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 bijvoorbeeld a=2+2; echo "$((3 * $a))" met a=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 gebruikt strcoll() 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 als expr operators) of awk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1" zijn de standaardopdrachten om stringvergelijking uit te voeren met strcoll().

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *