Назад | Перейти на главную страницу

Что означает знак минус внутри долларовых скобок сценария оболочки?

В существующем сценарии оболочки я вижу ссылки на некоторые переменные, которые либо включают, либо оканчиваются знаком минус. Например:

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"