Ответ 1
Переменные внутри ${...}
называются "Расширение параметров".
Ищите этот термин в электронном руководстве или в настоящем руководстве (строка 792).
Форма ${var-}
похожа по форме на ${var:-}
. Разница объясняется всего за одну строку до расширения :-
(строка 810):
... bash проверяет наличие неустановленного или нулевого параметра. Опуская толстую кишку приводит к проверке только для параметра, который не установлен.
Таким образом, эта форма проверяет только, когда переменная не установлена (и не ноль), и заменяет все расширение ${...}
на значение после -
, которое в этом случае равно нулю.
Следовательно, ${var-}
становится:
- Значение var, когда var имеет значение (и не ноль).
- Также значение var (двоеточие: отсутствует!), Когда var равно null:
''
, таким образом: также null. - Значение после - (в данном случае ноль
''
), если переменная не установлена.
Все это только на самом деле:
- Разверните до
''
, когда var либо не установлен, либо равен нулю. - Разверните до значения переменной 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"