bash-скрипт, если условно "${1:-}" [дубликат]

avatar
looock7897
8 августа 2021 в 16:50
62
1
0

Я пытаюсь понять условие if

log_daemon_msg () {
    if [ -z "${1:-}" ]; then
        return 1
    fi
    log_daemon_msg_pre "$@"

    if [ -z "${2:-}" ]; then
        echo -n "$1:" || true
        return
    fi

    echo -n "$1: $2" || true
    log_daemon_msg_post "$@"
}

что означает "${1:-}" и "${2:-}"

Источник
Charles Duffy
8 августа 2021 в 17:04
0

Кстати, echo -n "$1:" — это не очень хорошая форма — лучше было бы написать как printf '%s:' "$1".

Charles Duffy
8 августа 2021 в 17:05
0

Кроме того, о set -eu -- см. BashFAQ #105 для обсуждения того, почему set -e считается плохой идеей среди серьезных разработчиков оболочки, и BashFAQ #112 для обсуждения плюсов и минусов. из set -u (хотя это неплохая идея в том смысле, что set -e, необходимость использовать ${var:-} вместо просто $var, когда нужно, чтобы неустановленные значения не были вредными, является одним из минусов).

IMSoP
8 августа 2021 в 17:06
0

@CharlesDuffy К вашему первому комментарию: почему?

Charles Duffy
8 августа 2021 в 17:09
0

@IMSoP, стандарт POSIX для echo делает -n разрешенным , но не требует, чтобы он имел какое-либо особое поведение. echo -n разрешено печатать -n на выходе вместо подавления новой строки.

IMSoP
8 августа 2021 в 17:09
0

@CharlesDuffy А, так это потенциальная проблема с переносимостью, я этого не знал, спасибо.

Charles Duffy
8 августа 2021 в 17:09
0

@IMSoP, ... более того, bash можно настроить (во время компиляции, во время выполнения или с помощью переменных среды) для такого поведения, поэтому, даже если вы точно знаете, что ваша оболочка — это bash, вы не знаете, как echo будет себя вести.

Charles Duffy
8 августа 2021 в 17:10
1

@IMSoP Подробное обсуждение см. в разделе unix.stackexchange.com/a/65819/3113, а также в разделе ИСПОЛЬЗОВАНИЕ ПРИЛОЖЕНИЯ стандарта POSIX echo<29855219711279485 вместо этого2985521973127941> рекомендуется2 .

Ответы (1)

avatar
Socowi
8 августа 2021 в 16:58
2

См. Расширение параметров оболочки, {parameter:-word}.

${parameter:-word}
Если параметр не установлен или равен нулю, подставляется расширение слова. В противном случае подставляется значение параметра.

Поэтому ${1:-} — это первый аргумент функции log_daemon_msg или пустая строка, если функция была вызвана без аргументов или с пустым первым аргументом.

Обычно это не имеет особого смысла, так как простое написание $1 имело бы тот же эффект. Однако, если ваш скрипт работает с set -u (выход при использовании неопределенной переменной), ${1:-} можно использовать для получения стандартного поведения ($1 превращается в пустую строку, если не установлено). Но echo -n "$1: $2" в конце все равно потерпит неудачу в случае отсутствия аргументов.

IMSoP
8 августа 2021 в 17:00
0

Я собирался опубликовать то же самое, но потом не смог найти причину, по которой это может понадобиться, поскольку "$1" уже является пустой строкой, если $1 не установлено.

Charles Duffy
8 августа 2021 в 17:05
1

@IMSoP Поскольку в конце операторов, которые не являются терминальными для функций, есть || true, этот код явно написан для запуска с set -e. Тот, кто использует set -e, скорее всего, также будет использовать set -u.

Charles Duffy
8 августа 2021 в 17:08
0

@Socowi, ... Я не верю, что выходов set -u можно избежать через || true. См. ideone.com/SMPT7x; в этом отношении я считаю, что последнее редактирование делает ответ хуже.

Socowi
8 августа 2021 в 17:12
1

@CharlesDuffy Спасибо за уведомление. Я попал в ловушку: я протестировал его в сеансе интерактивной оболочки, но posix указывает "Интерактивная оболочка не должна выходить".