2017-07-08 111 views
1

我正在编写一个bash脚本,它使用其他输入为命令构建一组复杂的参数。到目前为止,该脚本使用该技术完美运行:在Bash命令参数中处理引号和转义空格

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

虽然它的作品,我很谨慎使用eval,因为一个坏的文件名进行破坏的风险的。我希望能够跳过分配变量然后对其进行评估,而只是将该命令放在行首,并让所有参数都由之前在脚本中构建的适当变量设置。

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

在bash脚本中这样做的最佳做法是什么?

+0

我们真的需要看看你想要完成什么,而不是使用哪种技术来提供真正的点对点答案。也就是说,你的问题几乎肯定由[BashFAQ#50]覆盖(http://mywiki.wooledge.org/BashFAQ/050)。 –

+0

顺便说一句,http://shellcheck.net/是你的朋友捕捉案件时引用是失踪/丢失。 –

+0

另一方面,'command'是一个实际的内建命令的名称,使它成为一个错误的名称用作占位符/示例。 –

回答

2

这真的这样简单:

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

也就是说:

  • 参数扩展在双引号(其中一个变量的名字被替换为它的价值) - 连如果您认为该值只能是数字。
  • 不要用任何种类的eval,或分配打扰等

唯一需要的引号语法,不是字面 - “嵌套”或“逃逸”的报价是没有语法含义的文字字符,所以它们对解析没有任何影响(没有额外的解析步骤,如eval生成的那样,在所有可避免的情况下确实是不好的练习),并且只为实际运行的命令添加额外的不需要的内容。


因为当你认为你需要在一个变量中存储的命令其他原因(可添加参数是有条件,还是要能够重复使用),请参阅BashFAQ #50案件。

如果您还没有确信eval是一个不好的想法,那么您应该阅读BashFAQ #48

关于Quotes的Wooledge页面对于这个问题来说是一个很好的资源。

+0

谢谢!我将使用您的解决方案,并阅读Bash Faqs和Wooledge页面以供将来参考。我非常有义务有机会学习。再次感谢。 – user2480136