В чем смысл этого стиля в bash?
${PUBLIC_INTERFACE:-eth0}
Какова цель :-
?
В чем смысл этого стиля в bash?
${PUBLIC_INTERFACE:-eth0}
Какова цель :-
?
Если $PUBLIC_INTERFACE
существует и не является нулевым, верните его значение, в противном случае верните "eth0"
.
На самом деле некоторые из них описаны на странице bash:
${parameter: -word} Использовать значения по умолчанию. Если параметр не задан или нулевым, заменяется слово. В противном случае значение параметра будет заменено.
${parameter: = word} Назначить значения по умолчанию. Если параметр не задан или null, расширение слова присваивается параметру. Затем значение параметра заменяется. Таким образом нельзя назначить позиционные параметры и специальные параметры.
${parameter:? word} Отобразить ошибку, если Null или Unset. Если параметр равен нулю или не задан, расширение слова (или сообщение на этот счет, если слово отсутствует) записывается в стандартную ошибку, и оболочка, если она не является интерактивной, завершает работу. В противном случае значение параметра будет заменено.
${parameter: + word} Используйте альтернативное значение. Если параметр имеет значение null или не задан, ничто не заменяется, иначе заменяется слово.
:-
используется в ${parameter:-word}
расширение параметра оболочки: если parameter
имеет значение null или unset, он расширяется до значение word
, в противном случае значение parameter
.
Пример:
$ str=
$ echo "${str:-default}"
default
Это и аналогичные разложения с использованием :=
, :+
и :?
все имеют два отличия: с двоеточием и без него. Разница в том, что расширение с помощью двоеточия срабатывает для "null или unset", тогда как без двоеточия это просто "null".
Заметим:
$ str= # Null, but not unset
$ echo "${str-default}" # Expands to value of $str, the empty string
$ echo "${str:-default}" # Expands to "default"
default
Где это полезно? Несколько примеров:
Значения по умолчанию
fc
, является результатом расширения ${FCEDIT:-${EDITOR:-vi}}
: $FCEDIT
, если определено, или $EDITOR
, если определено, или vi
.Цикл в script, который должен читать из файла, если он указан как аргумент, и из стандартного ввода в противном случае может выглядеть так:
while IFS= read -r line; do
# do something
done < "${1:-/dev/stdin}"
При использовании set -u
set -u
- это удобный способ принудительного создания сценариев с помощью script die при встрече с неустановленной переменной, чему способствует, например, эта статья (не то, что я поддерживаю все там 1). Если мы хотим проверить, имеет ли определенная переменная значение с [[ $var ]]
, script теперь умирает, если var
не задано, хотя это может быть законным.
В этом случае используется [[ ${var:-} ]]
, а set -u
не будет жаловаться. (Это в основном использует значение по умолчанию снова, но замещаемое значение представляет собой пустую строку в этом случае.)
Эти расширения не являются эксклюзивными для Bash, кстати: спецификация оболочки POSIX тоже. >
1 См. также BashFAQ/112, Каковы преимущества и недостатки использования set -u (или набора -o nounset)?