内部引号对你没有好处——不要试图使用它们。在 的情况下myvar="\"foo\""
,外引号是语法,但内引号是数据。作为数据的引号不会被 shell 用于字符串拆分目的,它们以后也不会变成语法(除非您使用eval
,这会引入许多新问题,其中许多会影响安全);他们所做的只是添加您的实际命令不需要或不需要的数据。
您需要在扩展周围使用语法引号,以防止字符串拆分和全局扩展。比较这四个例子(只有第一个是正确的):
do_something_with() {
printf '<%s> ' "$@"
echo
}
myvar="Hello Stackoverflow"
do_something_with "$myvar" # output: <Hello Stackoverflow>
do_something_with $myvar # output: <Hello> <Stackoverflow>
myvar2="\"Hello Stackoverflow\""
do_something_with $myvar2 # output: <"Hello> <Stackoverflow">
do_something_with "$myvar2" # output: <"Hello Stackoverflow">
如果你想在一个变量中存储一些应该被解释为多个参数的东西,那么使用数组是正确的:
my_array=( Hello "Stack Overflow" )
do_something_with "${my_array[@]}" # output: <Hello> <Stack Overflow>
另请参阅http://mywiki.wooledge.org/BashFAQ/050