我需要执行bash命令,只有设置变量,我想在命令行中包括该变量。诀窍是该变量可以在其中具有一个空间,并且必须以单个参数传递该变量。

如果Foo尚不设置FOO(但是如果设置),则以下命令将不会执行正确的操作,它将通过命令栏一个空参数,因为未设置$FOO,而是双引号引用。

FOO=""
bar "$FOO"

以下命令修复了$FOO的缺陷,但如果$FOO有空间,则添加了通过两个参数的缺陷。

FOO="one two"
bar $FOO

我尝试使用bar $ {FOO+"}$FOO${FOO+"},但是虽然在那里卡住了引号,但它仍然通过了两个参数。我想,如果使用所有其他参数(在此处未列出)的评估中使用评估,那么如果没有大量测试,就不可能正确正确,也可以解决问题。

显然,您可以说if [ "$Z" ]; then bar "$Z"; else bar; fi,但这不是扩展。

完成此操作的最佳方法是什么?

分析解答

使用${var:+"$var"}

这是因为替代value尊重引号:

unset var
set -- ${var:+"$var"}
echo "Unset: $# args"

var=""
set -- ${var:+"$var"}
echo "Blank: $# args"

var="foo bar"
set -- ${var:+"$var"}
echo "Multiple words: $# args"

输出

Unset: 0 args
Blank: 0 args
Multiple words: 1 args

(要传递空字符串,而不是未设置的值,请​​在没有结肠的情况下使用${var+"$var"}