Bash 如何根据变量的值向命令添加额外参数?

Bash 如何根据变量的值向命令添加额外参数?,bash,Bash,我正在尝试自动为buildingunity3d项目制作Gitlab CI/CD 最后我得到了一个执行构建过程的长参数。现在,我想让脚本更具动态性,以防一些参数确实不需要,例如区分是否需要密钥存储的android构建 到目前为止,我的结局是这样的 /path/to/unity/unity-其他参数\ $([!-z$UNITY\u资产\u导出]&&assetPathNames$UNITY\u资产\u导出) 但它不输出任何东西,因此需要我使用echo命令。有没有更好的方法可以让我不在脚本中为每个变量

我正在尝试自动为building
unity3d
项目制作Gitlab CI/CD 最后我得到了一个执行构建过程的长参数。现在,我想让脚本更具动态性,以防一些参数确实不需要,例如区分是否需要密钥存储的android构建

到目前为止,我的结局是这样的

/path/to/unity/unity-其他参数\
$([!-z$UNITY\u资产\u导出]&&assetPathNames$UNITY\u资产\u导出)

但它不输出任何东西,因此需要我使用echo命令。有没有更好的方法可以让我不在脚本中为每个变量的情况乱扔
echo

echo
绝对是一种方法,而且仍然是最灵活、最具可读性的:

/path/to/unity/unity -other args \
$([ ! -z $UNITY_ASSETS_EXPORT ] && echo "-assetPathNames $UNITY_ASSETS_EXPORT")
然而,在这个简单的例子中,您可以使用bash的变量扩展和
${parameter:+word}
构造。如果
参数
为非空,则扩展为
单词
,否则扩展为空:

/path/to/unity/unity -other args \
${UNITY_ASSETS_EXPORT:+-assetPathNames $UNITY_ASSETS_EXPORT}

你的想法是对的,但是你处理可选参数的方式是不正确的。你的表情

$([ ! -z $UNITY_ASSETS_EXPORT ] && -assetPathNames $UNITY_ASSETS_EXPORT) 
设置变量时,计算结果如下所示

$(-assetPathNames $UNITY_ASSETS_EXPORT)
由于
$(..)
是一种命令替换语法,用于将内容作为命令执行,因此结果被视为要运行的命令,这是不正确的

使用类似数组的占位符来存储参数并将其传递给命令

unity_arg=([ ! -z "$UNITY_ASSETS_EXPORT" ] && -assetPathNames "$UNITY_ASSETS_EXPORT")
现在将数组内容传递给您的命令

/path/to/unity/unity -other args "${unity_arg[@]}"

数组扩展将在定义变量时生成正确的参数字符串,并在变量为空时扩展为零。

如果UNITY\u ASSETS\u EXPORT包含空格怎么办?那么使用这两种方法中的任何一种都会让您感到痛苦。或者一般的狂欢。我可能会停止使用oneliner,并将所有参数推送到一个数组中,这样即使某些成员包含空格,也可以安全地扩展该数组。此外,在终止
]
之前,您似乎缺少一个空格。很抱歉,我忘了这么做,您已经删除了answer@Inian你能恢复你的回答吗?或者这是你惩罚我的方式:(我觉得这样做真的很糟糕,而且写这篇评论之前我太忙了,以至于我忘记接受它,因为我认为它起作用了