是否存在行为差异:=和[[?

时间:2016-03-28 22:42:13

标签: bash variable-assignment colon-equals

这两个代码片段,一个使用冒号相等的表示法,另一个使用双括号程序表现出相同的行为?

: "${foo:=bar}"

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

如果他们的行为相同,那么哪一个在风格上是首选的?我已经看到这些在各个地方使用过,我无法确定哪一个更适合可维护性和可读性。

1 个答案:

答案 0 :(得分:2)

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

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

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

正如评论中所建议的那样,可以将另一种选择视为明确与简洁之间的妥协:

foo=${foo:-bar}

${foo:-bar}评估为$foo(如果已设置),否则为bar