【问题标题】:Are there behavioral differences between := and [[?:= 和 [[ 之间是否存在行为差异?
【发布时间】:2016-07-16 07:24:12
【问题描述】:

这两个代码 sn-ps,一个使用冒号等号,另一个使用双括号程序是否表现出相同的行为?

: "${foo:=bar}"

if ! [[ $foo ]]; then
    foo=bar
fi

如果它们的行为相同,那么在风格上更喜欢哪一个?我已经看到这两种在不同的地方使用,我无法确定哪一种更具有可维护性和可读性。

【问题讨论】:

    标签: bash variable-assignment colon-equals


    【解决方案1】:

    据我所知,它们在功能上是等效的。至于哪个最好,我会说这是一个品味问题。我个人更喜欢: ${foo:=bar},因为它更简洁,但其他不太熟悉语法的人可能会采用更明显的方法。

    请注意,您的第一种方法使用标准外壳功能,因此应该适用于任何符合 POSIX 的外壳。为了使您的第二种方法更便携,我会选择:

    if [ -z "$foo" ]; then
        foo=bar
    fi
    

    正如 cmets 中所建议的,另一个可以被视为在清晰性和简洁性之间折衷的选择是:

    foo=${foo:-bar}
    

    ${foo:-bar} 如果已经设置,则计算为 $foo,否则计算为 bar

    【讨论】:

    • if ! [ "$foo" ]; then 也符合 POSIX。
    • 我认为foo="${foo:-bar}" 是一个相当简洁的选项,对于那些不太熟悉shell 语法的人来说仍然可以合理理解。这至少使foo 被分配到的情况非常明显。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 2012-03-05
    • 1970-01-01
    • 2022-07-22
    • 2010-10-14
    • 2012-08-21
    • 2014-04-19
    相关资源
    最近更新 更多