См. Расширение параметров оболочки, {parameter:-word}
.
${parameter:-word}
Если параметр не установлен или равен нулю, подставляется расширение слова. В противном случае подставляется значение параметра.
Поэтому ${1:-}
— это первый аргумент функции log_daemon_msg
или пустая строка, если функция была вызвана без аргументов или с пустым первым аргументом.
Обычно это не имеет особого смысла, так как простое написание $1
имело бы тот же эффект. Однако, если ваш скрипт работает с set -u
(выход при использовании неопределенной переменной), ${1:-}
можно использовать для получения стандартного поведения ($1
превращается в пустую строку, если не установлено). Но echo -n "$1: $2"
в конце все равно потерпит неудачу в случае отсутствия аргументов.
Кстати,
echo -n "$1:"
— это не очень хорошая форма — лучше было бы написать какprintf '%s:' "$1"
.Кроме того, о
set -eu
-- см. BashFAQ #105 для обсуждения того, почемуset -e
считается плохой идеей среди серьезных разработчиков оболочки, и BashFAQ #112 для обсуждения плюсов и минусов. изset -u
(хотя это неплохая идея в том смысле, чтоset -e
, необходимость использовать${var:-}
вместо просто$var
, когда нужно, чтобы неустановленные значения не были вредными, является одним из минусов).@CharlesDuffy К вашему первому комментарию: почему?
@IMSoP, стандарт POSIX для
echo
делает-n
разрешенным , но не требует, чтобы он имел какое-либо особое поведение.echo -n
разрешено печатать-n
на выходе вместо подавления новой строки.@CharlesDuffy А, так это потенциальная проблема с переносимостью, я этого не знал, спасибо.
@IMSoP, ... более того, bash можно настроить (во время компиляции, во время выполнения или с помощью переменных среды) для такого поведения, поэтому, даже если вы точно знаете, что ваша оболочка — это bash, вы не знаете, как
echo
будет себя вести.@IMSoP Подробное обсуждение см. в разделе unix.stackexchange.com/a/65819/3113, а также в разделе ИСПОЛЬЗОВАНИЕ ПРИЛОЖЕНИЯ стандарта POSIX
echo
<29855219711279485 вместо этого2985521973127941> рекомендуется2 .