【问题标题】:Idiomatic bash: set default value for variable [duplicate]惯用的 bash:为变量设置默认值
【发布时间】:2026-01-07 03:25:02
【问题描述】:

如何以简洁、惯用的方式为 bash 变量设置默认值?这看起来很丑:

if [[ ! -z "$1" ]]; then
    option="$1"
else
    option="default"
fi

【问题讨论】:

    标签: bash idioms


    【解决方案1】:

    你可以使用:

    option=${1:-default}
    

    如果给出了第一个命令行参数并且不为空,则这会将选项设置为第一个命令行参数。否则,它将选项设置为默认值。参看Bash reference manual了解参数扩展的详细信息和这种形式的一些有用的变体。

    【讨论】:

    • "请注意,如果您使用显式空的第一个参数调用脚本,则其行为可能与问题中的代码不同。"不,不会,因为您使用了冒号。如果您写${1-default},那么它将区分未设置和已设置但为空的参数。
    • @RomanCheplyaka,谢谢,在手册中确认了这一点并编辑了答案。
    【解决方案2】:
    default value               : ${parameter:-word} \
    assign default value        : ${parameter:=word}  |_ / if unset or null -
    error if empty/unset        : ${parameter:?mesg}  |  \ use no ":" for unset only
    use word unless empty/unset : ${parameter:+word} /
    

    【讨论】:

    • +1 以获得彻底的答案(尽管可能有点过于简洁 [缺少示例])。
    【解决方案3】:

    对于使用other而不是分配一个默认值,Toxaris 已经介绍过,值得一提的是-z 有一个反向测试,所以不是

    if [[ ! -z "$1" ]]; then
        do_something
    fi
    

    你可以简单地写:

    if [ -n "$1" ]; then
        do_something
    fi
    

    如果没有else 分支,可以将其缩短为:

    [ -n "$1" ] && do_something
    

    【讨论】:

    • 或者干脆if [ "$1" ]; then ...
    • [ -n "$1" ] && do_something 有一个缺点 - 如果设置了 set -e...
    • @anishsane 就set -e 而言,[...] && commandif [...]; then command; fi 相同。 [...] 命令可以安全地失败,command 在运行失败时将退出 shell。
    • 哦...我的错误。我不知道。。谢谢。