在 bash 脚本中运行时防止在空格处分割命令行参数

在 bash 脚本中运行时防止在空格处分割命令行参数

我正在尝试在 bash 变量中运行命令,如下所示:

cmd="python -m mymodule 'argument 123 456' argument2=32 argument3=234"
$cmd

看起来它正在分割第一个字符串中的命令行参数,即使它用单引号引起来:

['argument', '123', '456', 'argument2=32', 'argument3=234']

我能做些什么来防止这种情况发生吗?我尝试使用转义双引号\"、反引号`,但没有任何作用,它仍然会在空格上分割第一个命令行参数。

答案1

对于您的情况,我建议将命令及其参数存储在数组中:

cmd=( "python" "-m" "mymodule" "argument 123 456" "argument2=32" "argument3=324" )

并将其运行为

"${cmd[@]}"
  • 关键是像${cmd[@]}使用 an一样取消引用数组内容@,并将其放在双引号中,因为 shell 随后会将其扩展为数组元素列表,就像每个元素都用双引号括起来一样,从而防止分词(参见例如此相关问答了解更多信息)。

  • 同时,您必须添加 shell 将单独处理的每个标记作为其自己的数组元素(因此,例如"-m""mymodule"必须是单独的元素 - 声明它"-m mymodule"可能会失败,被误解为无值选项m mymodulem具有值的选项mymodule,包括前导空格 - 请参阅本次问答以获得更多见解)。

相关内容