Unix operatory Boolean ( & & ,- a|//,- o)

Czy ktoś może wyjaśnić różnicę między &&, ||, -a, i -o operatory uniksowe?

Jakie są ograniczenia stosowania obu typów?

Czy po prostu operatory && i || powinny być używane przy użyciu FLAG w warunku?

Jak w:

[ "$1" = "yes" ] && [ -r $2.txt ]

Kontra:

[ "$1" = "yes" -a $2 -lt 3 ]
Author: Benjamin W., 2013-12-08

2 answers

Zasada: użyj -a i -o wewnątrz nawiasów kwadratowych, && i || Na Zewnątrz.

Ważne jest, aby zrozumieć różnicę pomiędzy składnią shell a składnią [ polecenie .

  • && i || są operatorami powłoki. Są one używane do łączenia wyników dwóch poleceń. Ponieważ są składnią powłoki, mają specjalne znaczenie składniowe i nie mogą być używane jako argumenty do polecenia.

  • [ nie jest specjalną składnią. W rzeczywistości jest to polecenie o nazwie [, znane również jako test. Ponieważ [ jest zwykłym poleceniem, używa -a i -o dla swoich operatorów oraz i lub . Nie może używać && i ||, ponieważ są to składnie powłoki, których polecenia nie mogą zobaczyć.

Ale czekaj! Bash ma bardziej wymyślną składnię testu w postaci [[ ]]. Jeśli używasz podwójnych nawiasów kwadratowych, masz dostęp do takich rzeczy jak wyrażenia regularne i symbole wieloznaczne. Możesz również użyć operatorów powłoki, takich jak &&, ||, <, i > swobodnie wewnątrz nawiasów, ponieważ, w przeciwieństwie do [, Podwójna forma jest specjalną składnią powłoki. Bash sam parsuje [[, więc możesz pisać takie rzeczy jak [[ $foo == 5 && $bar == 6 ]].

 107
Author: John Kugelman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-08 04:07:55

- A I-o są starszymi operatorami i / lub dla polecenia test. && i/ / są operatorami powłoki. Tak więc (zakładając starą powłokę) w Twoim pierwszym przypadku,

[ "$1" = 'yes' ] && [ -r $2.txt ]

Powłoka ocenia stan and. W drugim przypadku

[ "$1" = 'yes' -a $2 -lt 3 ]

Polecenie test (lub Wbudowany test) ocenia stan and.

Oczywiście we wszystkich nowoczesnych lub półnowoczesnych powłokach, polecenie test jest wbudowane w powłokę, więc naprawdę nie ma żadnej lub dużej różnicy. W nowoczesnych muszlach, twierdzenie if można zapisać:

[[ $1 == yes && -r $2.txt ]]

, który jest bardziej podobny do współczesnych języków programowania, a tym samym jest bardziej czytelny.

 12
Author: Brad Lanam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-16 21:02:14