2013-12-08 3 views
34

Может кто-нибудь объяснить разницу между &&, ||, -a и -o Операторы Unix?Булевы операторы Unix (&&, -a, ||, -o)

Каковы ограничения на использование обоих типов?

Это просто, что операторы && и || должны использоваться при использовании флагов в состоянии?

Как и в:

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

против:

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

Мне интересно, когда вы решили использовать && и || для условий, а не -a и -o. –

ответ

91

правило: Использование -a и -o внутри квадратных скобок, && и || снаружи.

Важно понимать разницу между оболочкой синтаксисом и синтаксисом [команды.

  • && и || операторы оболочки. Они используются для объединения результатов двух команд. Поскольку они являются синтаксисом оболочки, они имеют особое синтаксическое значение и не могут использоваться в качестве аргументов для команд.

  • [ не является специальным синтаксисом. Это на самом деле команда с именем [, также известная как test. Поскольку [ является обычной регулярной командой, он использует -a и -o для своих и и или операторов. Он не может использовать && и ||, потому что это синтаксис оболочки, который команды не видят.

Но подождите! У Bash есть синтаксис синтаксического анализа в форме [[ ]]. Если вы используете двойные квадратные скобки, вы получаете доступ к вещам типа регулярных выражений и подстановочных знаков. Вы также можете использовать операторы оболочки, такие как &&, ||, < и > свободно внутри скобок, потому что, в отличие от [, двойная скобка формы - это специальный синтаксис оболочки. Bash анализирует [[, поэтому вы можете писать такие вещи, как [[ $foo == 5 && $bar == 6 ]].

+0

Еще раз спасибо. Это именно то, что мне нужно было знать. –

+1

Итак, -a и -o не нужны, если вы просто используете [[form? Есть ли преимущества использования [[$ foo == 5 && $ bar == 6]] vs [$ foo == 5 -a $ bar == 6]? –

+2

Да, кажется, что флаги '-o' и' -a' устарели в стандарте. Вероятно, они продолжат работать долгое время, но хорошо быть готовым к будущему. – janos

11

-a и -o являются старшими и/или операторами для команды тестирования. & & и || являются и/или операторами оболочки. Так (предполагается, что старая оболочка) в первом случае,

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

Оболочка оценивает и состояние. В вашем втором случае

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

Команда тест (или встроенный тест) оценивает и состояние.

Конечно, во всех современных или полусовременных оболочках тестовая команда встроена в оболочку, поэтому на самом деле нет никакой или большой разницы. В современных оболочках, если заявление может быть написано:

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

Что больше похож на современных языках программирования, и, таким образом, является более удобным для чтения.

+0

Означает ли это, что единственная скобка [форма устарела в пользу [[form? –

+2

[[form намного проще в использовании - он обрабатывает многие проблемы с цитированием. например в примере «$ 1» может быть оставлено без кавычек, даже если оно может быть пустым. –

+1

Это зависит от того, нужно ли вам поддерживать старые оболочки. Все современные ОС имеют либо bash (в/bin (linux),/usr/bin/или где-либо еще), либо/usr/bin/ksh, которые поддерживают [[form. –

Смежные вопросы