В чем разница между [ и [[ в Bash?
Проблема с использованием квадратных скобок в Bash
Я просмотрел страницу man для Bash и заметил, что конструкция [[
обозначает использование условных выражений. Затем я ознакомился с разделом о условных выражениях и увидел, что там перечислены те же операторы, что и для команды test
(и для одиночной квадратной скобки [
).
Теперь у меня возник вопрос: в чем разница между использованием [
и [[
в Bash?
3 ответ(ов)
[
и test
- это одно и то же, и работает аналогично бинарной команде test
(см. man test). Он работает почти так же, как [
в других оболочках на основе sh в многих UNIX-подобных системах. Однако он поддерживает только одно условие. Для выполнения нескольких тестов с помощью операторов bash &&
и ||
необходимо использовать отдельные квадратные скобки. У него нет встроенного оператора 'not', поэтому, чтобы инвертировать условие, используйте !
вне первых скобок, чтобы воспользоваться возможностью оболочки для инвертирования значений возврата команд. Операторы ==
и !=
выполняют буквальное сравнение строк.
[[
- это конструкция, специфичная для bash, хотя другие оболочки могут реализовать подобные элементы. Не ожидайте ее в старой UNIX sh. Операторы ==
и !=
применяют правила сопоставления шаблонов bash, см. "Сопоставление шаблонов" в man bash. У нее есть оператор совпадения regex =~
, а также разрешается использовать скобки и логические операторы !
, &&
и ||
внутри скобок для комбинирования подпоследовательностей.
В остальном они довольно похожи — большинство отдельный тестов работают одинаково в обоих случаях. Интересно становится только тогда, когда нужно комбинировать разные тесты с помощью логических операций AND/OR/NOT.
Самое важное отличие заключается в ясности вашего кода. Да, да, всё, что было сказано выше, верно, но использование [[ ]] делает ваш код более понятным, особенно в отношении операторов 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 ...
В bash, в отличие от конструкции [
, использование [[
предотвращает разделение слов в значениях переменных. Это означает, что когда вы используете [[
, значения переменных не будут разбиваться на несколько частей при наличии пробелов. Это дает вам дополнительную гибкость и помогает избежать некоторых распространенных ошибок, связанных с обработкой строк. Например:
var="значение с пробелами"
if [[ $var == "значение с пробелами" ]]; then
echo "Значение совпадает"
fi
В данном примере проверка будет выполнена корректно, и переменная var
будет сопоставлена с строкой, даже если она содержит пробелы, в отличие от использования [
, где нужно было бы заключить "$var"
в кавычки, чтобы избежать разделения.
Как изменить цвет вывода echo в Linux
Как работает "cat << EOF" в bash?
Передача параметров в функцию Bash
Расширение переменных внутри одинарных кавычек в команде Bash
Как разделить большой текстовый файл на меньшие файлы с равным количеством строк?