Если открывающаяся скобка является синонимом команды test, то у меня возникает вопрос - зачем нужна закрывающаяся скобка?
if [ $a -eq $b ]
В более поздних версиях bash поддерживается конструкция [[...]] (зарезервированное слово). В чем различия?
Почему при использовании [...] и нескольких условий (&&, ||) возникает ошибка, а при использовании конструкции [[...]] ошибки не возникает?
if [ $a -eq $b && $c -eq $d ] - ошибка
if [[ $a -eq $b && $c -eq $d ]] - не ошибка
UPD: используется интерпретатор #!/bin/bash.
Скрипты формата *.sh
Ответ
информация почерпнута из man bash
начнём с терминологии.
[[ — это compound command (составная команда)
[ и test — это просто builtin commands (встроенные команды)
составная команда (их список далеко не ограничивается командой [[) характеризуется тем, что её аргументом может быть составное выражение, объединяющее выражения с помощью следующих операторов (перечислены в порядке приоритета вычисления):
( выражение ) — группировка выражений для изменения порядка вычислений/выполнения
! выражение — «не»
выражение1 && выражение2 — «и»
выражение1 || выражение2 — «или»
команда [ не является именно синонимом команды test. синтаксис их вызова несколько отличается, хотя функционально они идентичны:
test выражение
[ выражение ]
у встроенных команд [ и test есть аналогичные, но чуть отличающиеся синтаксисом, операторы для группировки, отрицания, и логических операций «и/или»:
\( выражение \) — группировка
! выражение — «не» (тут синтаксис идентичен)
выражение1 -a выражение2 — «и»
выражение1 -o выражение2 — «или»
Комментариев нет:
Отправить комментарий