Tato otázka již má odpovědi zde :
Komentáře
- stackoverflow.com/ a / 18668580/1032785
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 zksh) provede aritmetické srovnání.arg1anum1zde 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$arg1je010a$num1je4+5, výsledek bude false (příkaz((...))se vrátí se stavem nenulového ukončení), protože010je osmičkový pro 8 a4+5je 9. -
(($arg1 >= $num1)): stejné jako výše, kromě toho$arg1a$num1se rozbalí, než se vyhodnotí celý aritmetický výraz. Pokud$arg1byl(2a$num1byl2), předchozí příkaz by selhal, protože(2a2)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říklada=2+2; echo "$((3 * $a))"sa=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$arg1a$num1jako 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í jakoexproperátory) neboawk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1"jsou standardní příkazy pro porovnání řetězců pomocístrcoll().