处理 Bash 命令参数中的引号和转义空格
Handling quoting and escaped spaces in Bash command arguments
我正在编写一个 bash 脚本,该脚本使用其他输入为命令构建一组复杂的参数。到目前为止,脚本使用此技术完美运行:
whatIwant="command \"$filename-with-spaces-maybe\" -opt1 \"$some_words\" -opt2 $a_number -opt3 \"$a_file_reference\" -opt4 \"$several_sentences\" "
eval $whatIwant
虽然它有效,但我对使用 eval
持谨慎态度,因为错误的文件名可能会造成损坏。我希望能够跳过分配变量然后对其进行求值,而只是将命令放在行的开头,并让所有参数都由我之前在脚本中构建的适当变量设置。
然而,当我尝试这样做时,文件名似乎没有被视为单个变量,而是作为多个参数传递给命令。我尝试了多种形式的双重转义,但未能找到正确评估的内容。这令人沮丧,因为当我回显我在其中构建命令的变量时,它会完美地复制并粘贴到命令行并执行我想要的操作。
在 bash 脚本中执行此操作的最佳做法是什么?
真的很简单:
your_command "$filename_with_spaces_maybe" -opt1 "$some_words" -opt2 "$a_number" -opt3 "$a_file_reference" -opt4 "$several_sentences"
也就是说:
- 将 每个 参数扩展(其中变量名替换为它的值)放在双引号中——即使您认为该值只是数字。
- 不要为任何类型的
eval
或作业等烦恼
唯一需要的引号是句法的,而不是字面的 -- "nested" 或 "escaped" 引号是没有句法意义的字面字符,所以它们对解析没有影响(没有额外的解析步骤,因为由 eval
生成,这在完全可以避免的情况下确实是一种不好的做法),只需向实际上是 运行.
的命令添加额外不需要的内容
如果您认为出于其他原因需要将命令存储在变量中(仅有条件地添加参数,或者能够重用它),请参阅 BashFAQ #50。
如果您还不相信 eval
是个坏主意,您会想阅读 BashFAQ #48。
Quotes 上的 Wooledge 页面通常是解决此问题的绝佳资源。
我正在编写一个 bash 脚本,该脚本使用其他输入为命令构建一组复杂的参数。到目前为止,脚本使用此技术完美运行:
whatIwant="command \"$filename-with-spaces-maybe\" -opt1 \"$some_words\" -opt2 $a_number -opt3 \"$a_file_reference\" -opt4 \"$several_sentences\" "
eval $whatIwant
虽然它有效,但我对使用 eval
持谨慎态度,因为错误的文件名可能会造成损坏。我希望能够跳过分配变量然后对其进行求值,而只是将命令放在行的开头,并让所有参数都由我之前在脚本中构建的适当变量设置。
然而,当我尝试这样做时,文件名似乎没有被视为单个变量,而是作为多个参数传递给命令。我尝试了多种形式的双重转义,但未能找到正确评估的内容。这令人沮丧,因为当我回显我在其中构建命令的变量时,它会完美地复制并粘贴到命令行并执行我想要的操作。
在 bash 脚本中执行此操作的最佳做法是什么?
真的很简单:
your_command "$filename_with_spaces_maybe" -opt1 "$some_words" -opt2 "$a_number" -opt3 "$a_file_reference" -opt4 "$several_sentences"
也就是说:
- 将 每个 参数扩展(其中变量名替换为它的值)放在双引号中——即使您认为该值只是数字。
- 不要为任何类型的
eval
或作业等烦恼
唯一需要的引号是句法的,而不是字面的 -- "nested" 或 "escaped" 引号是没有句法意义的字面字符,所以它们对解析没有影响(没有额外的解析步骤,因为由 eval
生成,这在完全可以避免的情况下确实是一种不好的做法),只需向实际上是 运行.
如果您认为出于其他原因需要将命令存储在变量中(仅有条件地添加参数,或者能够重用它),请参阅 BashFAQ #50。
如果您还不相信 eval
是个坏主意,您会想阅读 BashFAQ #48。
Quotes 上的 Wooledge 页面通常是解决此问题的绝佳资源。