在Bash命令参数中处理引用和转义空格

时间:2017-07-08 02:20:35

标签: bash quoting

我正在编写一个bash脚本,它使用其他输入为命令构建一组复杂的参数。到目前为止,该脚本完全符合这种技术:

whatIwant="command \"$filename-with-spaces-maybe\" -opt1 \"$some_words\" -opt2 $a_number  -opt3 \"$a_file_reference\" -opt4 \"$several_sentences\" "
eval $whatIwant

虽然它有效但我对使用eval持谨慎态度,因为文件名损坏的风险很大。我希望能够跳过赋值变量然后对其进行eval,这有利于只是将命令放在行的开头,并且所有参数都由我之前在之前构建的相应变量设置。脚本。

但是,当我尝试这样做时,文件名似乎不会被视为单个变量,而是作为多个参数传递给命令。我已经尝试了几种形式的双重逃避,但是没有设法找到正确评估的东西。令人沮丧的是因为当我回复我构建命令的变量时,它会完美地复制并粘贴到命令行并完成我想要的操作。

在bash脚本中执行此操作的最佳做​​法是什么?

1 个答案:

答案 0 :(得分:2)

这真的很简单:

your_command "$filename_with_spaces_maybe" -opt1 "$some_words" -opt2 "$a_number" -opt3 "$a_file_reference" -opt4 "$several_sentences"

也就是说:

  • 每个参数扩展(其中变量名称替换为其值)放在双引号中 - 即使您认为该值只是数字。
  • 不要打扰任何eval或任务等

所需的唯一引用是语法,而不是文字 - “嵌套”或“转义”引号是没有句法含义的文字字符,因此它们对解析没有影响(没有额外的解析步骤,由{{1}生成在完全可以避免的情况下,这确实是不好的做法),只需在实际运行的命令中添加额外的不需要的内容。

如果您认为由于其他原因需要在变量中存储命令(仅有条件地添加参数或能够重用它),请参阅BashFAQ #50

如果您还不确定eval是个坏主意,那么您需要阅读BashFAQ #48

Quotes上的Wooledge页面是这个问题的绝佳资源。