Bash:确保在不擦除任何现有值的情况下设置变量



假设我在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},但我还没有四处询问。

相关内容

最新更新