假设我在set -u
下运行一个bash脚本。显然,对于任何给定的变量,我都需要确保它是设置的。类似于:
foo=
然而,如果我想保留任何可能由调用方设置的预先存在的值,这将覆盖它
: ${foo:=}
但我有一些代码可以这样(更复杂(:
foo=${foo+$foo}
现在,我知道第二种方法有效。我的问题是,与第一种方式相比,是否有任何优势?我假设有,但现在记不清是什么了。有人能想到一个边缘案例吗(无论多么模糊(,在这个案例中,这两种结构会有不同的表现,或者提供一个令人信服的解释,说明它们不能?
我想不出在任何情况下它们会有所不同。它们只是同一事物的替代逻辑。
简单解决方案的含义是:如果foo
未设置/为空,则将其设置为空字符串。
代码的含义是:如果设置了foo
,则将其设置为自身,否则将其设置成空字符串。
你的代码看起来更像是工作——为什么要设置一些内容呢?只要什么都不做,它就会保持它的价值。这就是简单版本的作用。
您还可以通过删除参数展开中的:
来进一步简化简单的解决方案。
: ${foo=}
这使得它只测试foo
是否未设置。如果设置为空字符串,则无需指定默认值。
我的问题是,与第一种方式相比,是否有任何优势?
也许这是主观的,但一个优点是它看起来很像变量赋值。任何看到命令foo=${foo+$foo}
的人都会立即理解它设置了变量foo
(即使他们需要查找${parameter+word}
符号来确定它设置为什么(;但是看到命令CCD_ 9的人可能完全忽略它具有修改CCD_。(:
的使用肯定是一个暗示可能发生了什么,因为:
本身什么都不做;但它并没有那么明目张胆。(
当然,搜索foo=
脚本的人会找到前者,但不会找到后者。
也就是说,我个人会把它写为foo="${foo-}"
或foo="${foo:-}"
,这仍然清楚地表明它设置了foo
,但比foo=${foo+$foo}
简单了一个位。我还认为读者更可能熟悉${parameter-word}
而不是${parameter+word}
,但我还没有四处询问。