bash中命令的选项及参数使用变量传递

环境

1
2
3
4
5
test() {
local cmd="some cmd......."
local opt="-p 1 -o ''"
${cmd} ${opt}
}

复现

-o选项期望接受到空值。

test函数被执行后,命令的-o选项接受的参数不是空值,而是两个单引号''

如果修改为两个双引号""

1
local opt="-o """

命令的-o选项接受的参数是两个双引号"",也不是空值。

给单双引号加反斜杠转义也没有用,依然没有成功接受到空值。

解决

在bash中字符串拼接容易引发各种问题,需要熟悉bash解析脚本时对单词的分割和引号的处理才能避免,这时候应该使用数组来保存传递参数而不是字符串。

1
2
3
4
local opt=(
-p 1
-o ""
)

添加选项以及参数通过增加数组元素来添加

1
opt+=(-dn 1)

传递给命令时使用@来展开数组,同时使用双引号将数组变量括起来

1
"${cmd}" "${opt[@]}"