【问题标题】:bash scription if conditional "${1:-}" [duplicate]如果条件为“$ {1:-}”,则为bash脚本[重复]
【发布时间】:2021-08-08 16:50:16
【问题描述】:

我试图理解 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:-}”是什么意思

【问题讨论】:

  • 顺便说一句,echo -n "$1:" 不是很好的形式——最好写成printf '%s:' "$1"
  • 另外,关于set -eu -- 请参阅BashFAQ #105 讨论为什么set -e 在认真的shell 开发人员中被认为是一个坏主意,BashFAQ #112 讨论set -u 的优缺点(虽然与set -e 一样,这不是一个坏主意,但当人们希望未设置的值不会有害时,需要使用${var:-} 而不是仅仅使用$var 是缺点之一)。
  • @CharlesDuffy 你的第一条评论:为什么?
  • @IMSoP,echo 的 POSIX 标准使 -n 允许,但不要求它具有任何特定行为。 echo -n 允许在输出中打印 -n,而不是取消换行。
  • @IMSoP 请参阅unix.stackexchange.com/a/65819/3113 进行深入讨论,而the POSIX echo standard 的应用程序部分推荐printf

标签: bash if-statement parameter-expansion


【解决方案1】:

Shell Parameter Expansion, {parameter:-word}

${parameter:-word}
如果参数未设置或为空,则替换单词的扩展。否则,参数的值被替换。

所以${1:-} 是函数log_daemon_msg 的第一个参数,如果函数在没有参数或第一个参数为空的情况下调用,则为空字符串。

通常,这并没有什么意义,因为只是写$1 会产生相同的效果。但是,如果您的脚本以set -u 运行(使用未定义变量时退出)${1:-} 可用于获取标准行为(如果未设置$1 将变为空字符串)。但是在缺少参数的情况下,最后的echo -n "$1: $2" 仍然会失败。

【讨论】:

  • 我正要发布同样的内容,但找不到任何需要这样做的理由,因为如果未设置 $1"$1" 已经是一个空字符串。
  • @IMSoP 由于在不是函数终端的语句末尾有|| trues,所以这段代码显然是用set -e 运行的。使用set -e 的人很可能也会使用set -u
  • @Socowi, ...我不相信可以通过|| true 避免set -u 退出。见ideone.com/SMPT7x;在这方面,我相信最近的修改让答案变得更糟。
  • @CharlesDuffy 感谢您的通知。我陷入了陷阱:我在交互式 shell 会话中对其进行了测试,但 posix 指定了“An interactive shell shall not exit”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-15
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 1970-01-01
相关资源
最近更新 更多