我正在编写一个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脚本中执行此操作的最佳做法是什么?
答案 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页面是这个问题的绝佳资源。