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 ]
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ż jakotest
. 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 ]]
.
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.
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