В чем разница между тестовой командой и отдельным условным выражением, окруженным [[]]?

$ grep -vE '^#+( [ [:alpha:]]+ \{\.[ [:alpha:]]+\})?$' file
# Lorem.tip}
# LIPSUM {.tip
# Title

Расширенное регулярное выражение соответствует строкам «ОК». С помощью -vмы просим посмотреть строки, которые не совпадают.

Шаблон требует, чтобы строка начиналась с некоторого количества #символов. Остальная часть строки необязательна, но если она существует, она должна начинаться с пробела, затем содержать несколько букв, возможно, с пробелами в -между ними, а затем последний пробел перед {. Часть в пределах {и }должна начинаться с точки и может содержать некоторое количество букв и пробелов.

1
30.07.2020, 12:33
1 ответ

Это в основном описано в Почему расширение параметра с помощью пробелов без кавычек работает внутри двойных скобок "[[", но не внутри одинарных скобок "["? . В двух словах, [[ … ]]— это специальный синтаксис с другими правилами синтаксического анализа, а testи [— обычные команды.

В простом формате sh(, включая ksh, bashи т. д. ), test -n $varприменяет разделение и подстановку значения varиз-за отсутствия двойных кавычек. Внутри двойных скобок этого не происходит.

Изюминка zshзаключается в том, что zshв основном не требует двойных кавычек вокруг раскрытия переменных. Однако есть одно различие между $varи "$var"в контексте списка, например, в командной строке :, если слово пусто и не содержит кавычек, zshудаляет его. Таким образом, когда значение varпусто, test -n $var— это команда testс одним аргументом -n, а testс одним непустым аргументом -— «истина». Но test -n "$var"— это команда testс двумя аргументами -nи пустой строкой, которая применяет проверку -nк пустой строке, что является «ложью».

Внутри [[ … ]]удаление пустого -слова не происходит, поэтому [[ -n $var ]]и [[ -n "$var" ]]эквивалентны.

1
18.03.2021, 23:15

Теги

Похожие вопросы