Historycznie test
komenda istniała jako pierwsza (przynajmniej jeszcze w 7. edycji Unix w siódmej edycji ). Stosowany operatorów =
i !=
porównać strun, i -eq
, -ne
, -lt
, itd., Aby porównać numery. Na przykład test 0 = 00
jest fałszywy, ale test 0 -eq 00
jest prawdziwy. Nie wiem, dlaczego wybrano tę składnię, ale być może trzeba było unikać używania <
i >
, które powłoka analizowałaby jako operatory przekierowania. test
Polecenie dostał inną składnię kilka lat później: [ … ]
jest równoważna test …
.
[[ … ]]
Składni warunkowe, wewnątrz której <
i >
może być stosowany jako podmiotów bez podania dodano później, w KSH. Zachował kompatybilność wsteczną [ … ]
, więc używał tych samych operatorów, ale dodawał <
i >
porównywał ciągi znaków (na przykład, [[ 9 > 10 ]]
ale [[ 9 -lt 10 ]]
). Aby uzyskać więcej informacji, zobacz używanie pojedynczego lub podwójnego nawiasu klamrowego
Wyrażenia arytmetyczne pojawiły się później niż test
polecenie, w powłoce Korna , w pewnym momencie w latach 80. Postępowali zgodnie ze składnią języka C, który był bardzo popularny w kręgach uniksowych. Dlatego używali operatorów C: ==
dla równości, <=
dla mniejszej lub równej itp.
Unix Siódma Edycja nie miała wyrażeń arytmetycznych, ale miała expr
komendę , która również implementowała składnię podobną do C dla operacji na liczbach całkowitych, w tym operatorów porównania. W skrypcie powłoki znaki <
i znaki >
muszą być cytowane, aby chronić je przed powłoką, np. if expr 1 \< 2; …
Jest równoważne if test 1 -lt 2; …
. Dodanie wyrażeń arytmetycznych do powłoki spowodowało, że większość zastosowań była expr
przestarzała, więc nie jest ona dziś dobrze znana.
W skrypcie sh zwykle używasz wyrażeń arytmetycznych do obliczania wartości liczb całkowitych i [ … ]
do porównywania liczb całkowitych.
if [ "$((x + y))" -lt "$z" ]; then …
W skrypcie ksh, bash lub zsh możesz używać ((…))
obu.
if ((x + y < z)); then …
[[ … ]]
Forma jest przydatna, jeśli chcesz skorzystać z udziałem warunkowe rzeczy inne niż liczb całkowitych.
= != < <= > >=
porównaj ciągi .1 -eq 01
ale1 != 01
i8 -lt 42
ale8 > 42