Jsem trochu zmatený z toho, co tyto operátory dělají jinak, když jsou použity v bash (závorky, dvojité závorky, závorky a dvojité závorky).
[[ , [ , ( , ((
Viděl jsem, jak je lidé používají na příkazech if typu:
if [[condition]]
if [condition]
if ((condition))
if (condition)
Přijatá odpověď:
V shellech podobných Bourneovi, if
příkaz obvykle vypadá takto
if
command-list1
then
command-list2
else
command-list3
fi
then
klauzule se provede, pokud je výstupní kód command-list1
seznam příkazů je nulový. Pokud je výstupní kód nenulový, pak else
doložka je provedena. command-list1
může být
jednoduché nebo složité. Může to být například sekvence jednoho nebo více kanálů oddělených jedním z operátorů ;
, &
, &&
, ||
nebo nový řádek. if
níže uvedené podmínky jsou pouze speciální případy command-list1
:
-
if [ condition ]
[
je jiný název pro tradičnítest
příkaz.[
/test
je standardní nástroj POSIX. Všechny shelly POSIX to mají vestavěné (ačkoli to POSIX² nevyžaduje).test
příkaz nastaví ukončovací kód aif
prohlášení se podle toho chová. Typické testy jsou, zda soubor existuje nebo zda se jedno číslo rovná jinému. -
if [[ condition ]]
Toto je nová upgradovaná varianta
test
¹ od ksh ten bash , zsh , yash , busybox sh také podporovat. Tento[[ ... ]]
konstrukt také nastavuje výstupní kód aif
prohlášení se podle toho chová. Mezi jeho rozšířené funkce může testovat, zda řetězec odpovídá vzoru zástupného znaku (ne v busybox sh ). -
if ((condition))
Další ksh rozšíření, které bash a zsh také podporovat. Tím se provede aritmetika. Jako výsledek aritmetiky je nastaven výstupní kód a
if
prohlášení se podle toho chová. Pokud je výsledek aritmetického výpočtu nenulový, vrátí návratový kód nula (pravda). Jako[[...]]
, tento formulář není POSIX, a proto není přenosný. -
if (command)
Toto spustí příkaz v podshellu. Po dokončení příkazu nastaví návratový kód a
if
prohlášení se podle toho chová.Typickým důvodem pro použití takového subshell je omezení vedlejších účinků
command
ifcommand
požadovaná přiřazení proměnných nebo jiné změny v prostředí shellu. Takové změny nezůstanou po dokončení subshell. -
if command
provede se příkaz a
if
příkaz se chová podle svého výstupního kódu.