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í.arg1
anum1
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
je010
a$num1
je4+5
, výsledek bude false (příkaz((...))
se vrátí se stavem nenulového ukončení), protože010
je osmičkový pro 8 a4+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
byl2)
, předchozí příkaz by selhal, protože(2
a2)
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$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í jakoexpr
operátory) neboawk "BEGIN{exit(!(""ARGV[1] <= ""ARGV[2]))}" "$arg1" "$num1"
jsou standardní příkazy pro porovnání řetězců pomocístrcoll()
.