Jak používat operátory porovnání v bash? [duplicate]

Tato otázka již má odpovědi zde :

Komentáře

Odpověď

Tyto operátory se používají např. v (( ... )) a $(( ... )) ( aritmetické hodnocení a aritmetické rozšíření ):

if (( arg1 >= num1 )) && (( arg2 <= num2 )); then ... fi 

A také s let. Toto je ekvivalent výše uvedeného:

if let "arg1 >= num1" && let "arg2 <= num2"; then ... fi 

Viz část s názvem „ARITMETICKÉ HODNOCENÍ“ v příručce k bashům.

Odpovědět

V bash konkrétně:

  • ((arg1 >= num1)) (zděděno z ksh) provede aritmetické srovnání. arg1 a num1 zde odkazují na proměnné prostředí se stejným názvem. Každá proměnná je interpretována jako aritmetická expanze a výsledek nahrazen. Zde, pokud $arg1 je 010 a $num1 je 4+5, výsledek bude false (příkaz ((...)) se vrátí se stavem nenulového ukončení), protože 010 je osmičkový pro 8 a 4+5 je 9.
  • (($arg1 >= $num1)): stejné jako výše, kromě toho $arg1 a $num1 se rozbalí, než se vyhodnotí celý aritmetický výraz. Pokud $arg1 byl (2 a $num1 byl 2), předchozí příkaz by selhal, protože (2 a 2) nejsou samy o sobě platné výrazy. Ale tady by to uspělo, protože (2 >= 2) by byl aritmetický výraz, který se hodnotí. Obecně je v aritmetických výrazech lepší $ vynechat. Porovnejte například a=2+2; echo "$((3 * $a))" s a=2+2; echo "$((3 * a))".
  • let "..." (také z ksh). Stejné jako ((...)) kromě toho, že je to analyzován jako normální příkaz, je méně čitelný, je tak málo přenosný a je třeba věnovat větší pozornost citování.
  • [ "$arg1" -ge "$num1" ]. To je standardní a přenosné. Podporovány jsou pouze desetinné konstanty. [ 010 -ge 9 ] je stejný jako [ 10 -ge 9 ].
  • [[ $arg1 -ge $num1 ]]. Také z ksh, ale s velkými rozdíly. Tentokrát jsou považovány $arg1 a $num1 jako aritmetické výrazy a nejen desítkové konstanty. [[ 010 -ge 9 ]] vrátí opět hodnotu false.
  • [[ $arg1 < $num1 ]]. Porovnání řetězců. To používá strcoll() k porovnání řetězců, proto použijte třídicí algoritmus v národním prostředí. Všimněte si, že zatímco < a > použít třídicí algoritmus, = / == provést srovnání bajt-bajt, takže mohou existovat dvojice řetězců, pro které všechny <, > a = / == vrátí hodnotu false. <= a >= nejsou podporovány.
  • [ "$arg1" "<" "$num1" ]. Nestandardní. Stejné jako výše, ale pomocí příkazu [. < je třeba uvést, aby se nebral jako operátor přesměrování.
  • expr " $arg1" "<=" " $num1" > /dev/null (všimněte si vloženého mezery k vynucení lexikálního srovnání a vyhnutí se problémům s řetězci, které vypadají jako expr operátory) nebo awk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1" jsou standardní příkazy pro porovnání řetězců pomocí strcoll().

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *