Что означает '-' (тире) после имен переменных?

if [ -n "${BASH-}" -o -n "${ZSH_VERSION-}" ] ; then
    hash -r 2>/dev/null
fi

Где я могу найти ссылку на это? Спасибо.

Ответ 1

Переменные внутри ${...} называются "Расширение параметров".
Ищите этот термин в электронном руководстве или в настоящем руководстве (строка 792).
Форма ${var-} похожа по форме на ${var:-}. Разница объясняется всего за одну строку до расширения :- (строка 810):

... bash проверяет наличие неустановленного или нулевого параметра. Опуская толстую кишку приводит к проверке только для параметра, который не установлен.

Таким образом, эта форма проверяет только, когда переменная не установлена (и не ноль), и заменяет все расширение ${...} на значение после -, которое в этом случае равно нулю.

Следовательно, ${var-} становится:

  1. Значение var, когда var имеет значение (и не ноль).
  2. Также значение var (двоеточие: отсутствует!), Когда var равно null: '', таким образом: также null.
  3. Значение после - (в данном случае ноль ''), если переменная не установлена.

Все это только на самом деле:

  1. Разверните до '', когда var либо не установлен, либо равен нулю.
  2. Разверните до значения переменной var (если она имеет значение).

Следовательно, расширение ничего не меняет ни в значении var, ни в расширении, оно просто избегает возможной ошибки, если в оболочке установлена опция nounset.

Этот код остановится в обоих случаях использования $var:

#!/bin/bash
set -u

unset var

echo "variable $var"
[[ $var ]] && echo "var set"

Однако этот код будет работать без ошибок:

#!/bin/bash
set -u

unset var
echo "variable ${var-}"
[[ ${var-} ]] && echo "var set"

Ответ 2

Это расширение параметра bash, которое используется для проверки того, не установлена ​​ли переменная

Объяснение

Когда вы используете ${ZSH_VERSION-WORD} вместо $ZSH_VERSION в bash script, bash будет выполнять дополнительную логику

if $ZSH_VERSION is set
then 
    simply use the value of $ZSH_VERSION as per normal

elseif

$ZSH_VERSION is NOT set 
then
    use value of WORD - which isnt provided in your case - so null

используется

Ссылки

Расширение базового параметра описано в документах man bash (строка 939 справочной страницы bash).

см.: POSIX

также см. этот SO ответ

Ответ 3

В нормальных условиях ${FOO-} ведет себя точно так же, как ${FOO}.

Однако, при set -u, разблокирование неустановленных переменных становится ошибкой по умолчанию.

Так что ${FOO} может быть ошибкой, но ${FOO-} никогда не будет.