В существующем сценарии оболочки я вижу ссылки на некоторые переменные, которые либо включают, либо оканчиваются знаком минус. Например:
PID=${PID-/run/unicorn.pid}
и:
run_by_init() {
([ "${previous-}" ] && [ "${runlevel-}" ]) || [ "${runlevel-}" = S ]
}
Что означают знаки минус в обоих этих сценариях?
Согласно разделу «Расширение параметров» на странице руководства bash, это означает «использовать значение по умолчанию, если параметр не установлен». Так, например,
${PID-/run/unicorn.pid}
равно $ PID, если установлен $ PID, иначе /run/unicorn.pid.
Следует подчеркнуть, что это означает сброшен переменная. Не пустой.
И сравнить с :-
, который будет использовать значение по умолчанию (после знака минус), если переменная не установлено или ноль (как в пустой строке).
Минус без двоеточия встречается не так часто (по крайней мере, мной) и имеет более конкретное применение, чем :-
Это даже не упоминается на Руководство GNU а не в моем man bash
, но это описано например на tldp.
В случаях, когда вам нужно заменить значение по умолчанию, когда переменная не содержит разумного значения. Позднее подходит больше.
PID=${PID-/run/unicorn.pid}
PID мог быть использован и позже очищен с помощью PID = "" в скрипте. Эта ассоциация завершится неудачно, и PID останется пустой строкой ""
PID=${PID:-/run/unicorn.pid}
PID станет "/run/unicorn.pid", если он не был установлен, но даже если раньше он был равен нулю ("").
Конструкция без значения по умолчанию ${previous-}
обсуждается как гарантия от кого-то set -u
set -u | существительное
Считайте неустановленные переменные и параметры, отличные от специальных параметров «@» или «*», ошибкой при выполнении раскрытия параметров. Сообщение об ошибке будет записано в стандартную ошибку, и неинтерактивная оболочка завершится.
https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html
set -u
[ "${previous}" ] || echo "This will fail"
[ "${previous-}" ] || echo "This works"