5

В чем разница между [ и [[ в Bash?

281

Проблема с использованием квадратных скобок в Bash

Я просмотрел страницу man для Bash и заметил, что конструкция [[ обозначает использование условных выражений. Затем я ознакомился с разделом о условных выражениях и увидел, что там перечислены те же операторы, что и для команды test (и для одиночной квадратной скобки [).

Теперь у меня возник вопрос: в чем разница между использованием [ и [[ в Bash?

3 ответ(ов)

0

[ и test - это одно и то же, и работает аналогично бинарной команде test (см. man test). Он работает почти так же, как [ в других оболочках на основе sh в многих UNIX-подобных системах. Однако он поддерживает только одно условие. Для выполнения нескольких тестов с помощью операторов bash && и || необходимо использовать отдельные квадратные скобки. У него нет встроенного оператора 'not', поэтому, чтобы инвертировать условие, используйте ! вне первых скобок, чтобы воспользоваться возможностью оболочки для инвертирования значений возврата команд. Операторы == и != выполняют буквальное сравнение строк.

[[ - это конструкция, специфичная для bash, хотя другие оболочки могут реализовать подобные элементы. Не ожидайте ее в старой UNIX sh. Операторы == и != применяют правила сопоставления шаблонов bash, см. "Сопоставление шаблонов" в man bash. У нее есть оператор совпадения regex =~, а также разрешается использовать скобки и логические операторы !, && и || внутри скобок для комбинирования подпоследовательностей.

В остальном они довольно похожи — большинство отдельный тестов работают одинаково в обоих случаях. Интересно становится только тогда, когда нужно комбинировать разные тесты с помощью логических операций AND/OR/NOT.

0

Самое важное отличие заключается в ясности вашего кода. Да, да, всё, что было сказано выше, верно, но использование [[ ]] делает ваш код более понятным, особенно в отношении операторов AND (&&), OR (||) и NOT (!). Таким образом, переходя между системами и языками, вы сможете быстрее интерпретировать скрипт, что значительно облегчит вашу работу. Для более детального понимания вы можете обратиться к хорошей литературе по UNIX/Linux. Некоторые тонкости могут быть полезны в определённых ситуациях, но вы всегда будете ценить чистый код! Какой фрагмент кода вам было бы приятнее читать? Даже вне контекста, первый вариант выглядит проще и понятнее.


if [[ -d "$newDir" && -n $(echo $newDir | grep "^${webRootParent}") && -n $(echo $newDir | grep '/$') ]]; then ...

или

if [ -d "$newDir" -a -n "$(echo "$newDir" | grep "^${webRootParent}")" -a -n "$(echo "$newDir" | grep '/$')" ]; then ...
0

В bash, в отличие от конструкции [, использование [[ предотвращает разделение слов в значениях переменных. Это означает, что когда вы используете [[, значения переменных не будут разбиваться на несколько частей при наличии пробелов. Это дает вам дополнительную гибкость и помогает избежать некоторых распространенных ошибок, связанных с обработкой строк. Например:

var="значение с пробелами"
if [[ $var == "значение с пробелами" ]]; then
    echo "Значение совпадает"
fi

В данном примере проверка будет выполнена корректно, и переменная var будет сопоставлена с строкой, даже если она содержит пробелы, в отличие от использования [, где нужно было бы заключить "$var" в кавычки, чтобы избежать разделения.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь