Я смотрю на сценарий, который имеет:
if [ "${PS1-}" ]; then
Этот трейлинг -
немного беспокоит меня, потому что он не соответствует стандартному синтаксису Posix или Bash. Это какой-то загадочный синтаксис, который был всегда, или это опечатка? Любые ссылки на стандарты / документы будут приветствоваться.
Обычно я бы написал это:
if [ "$PS1" ]; then
Что является более правильным или есть разница между ними?
zsh
это единственная оболочка, о которой я знаю, которая явно упоминает варианты без двоеточия, а не просто записывает, что делает пропущение двоеточия.Расширение переменной
${parameter:-word}
будет использовать значение$parameter
if, если оно установлено, и ненулевое (не пустая строка), в противном случае оно будет использовать строкуword
.Пропуск
:
не проверяет, является ли значение пустым, только независимо от того, установлено оно или нет.Это означает, что
${PS1-}
будет расширяться до значения,$PS1
если оно установлено, но до пустой строки, если она пуста или не установлена. В этом случае, это точно так же , как${PS1:-}
как строка после-
также опорожнить.Как замечает @Rakesh Sharma, разница между
"${PS1-}"
и"$PS1"
незначительна: оба расширятся до значения$PS1
или до пустой строки, если она не задана. Исключением является то, когдаset -u
активен, и в этом случае расширение неустановленных переменных может вызвать ошибку . (Пустое) значение по умолчанию, установленное с помощью"${PS1-}"
обхода этого, расширяет unsetPS1
до пустой строки без ошибок.Это стандартный синтаксис ( возник в оболочке Bourne в конце 70-х годов ), как и пара других подобных расширений.
источник
"$PS1"
, еслиPS1
он пустой, то он пустой, а кавычки не дают слову полностью исчезнуть.set -u
это не действует. Когда опция nounset включена, «$ PS1» => выдает ошибку. "$ {PS-}" не будет.${parameter:-word}
будет использоваться значение,$parameter
если оно не NULL. Во всех других случаях (что означает: либо установлен, но NULL, либо не установлен), он будет использоватьword
. Ваша формулировка:if its set or null
set AND nonnull
= = использовать себя. В противном случае (set but NULL OR unset
) => использовать слово.Синтаксис:
и специальная форма:
является допустимым синтаксисом в оболочке POSIX , означает использование значения по умолчанию,
word
еслиparameter
оно не установлено или равно нулю.Обычно, с
word
пусто, тогда:и:
или:
эквивалентны.
Но под действием
set -u
всех неустановленных переменных оболочка завершается.${parameter-}
используется для обхода этого строгого правила. Это работает в обоих случаях, так что да, это более правильный путь.источник