举一个小例子:
#!/bin/bash -x
myvar="\"Hello Stackoverflow\""
ping $myvar
这样做的结果是任何命令(例如ping这里)都会自动看到' Hello'之间的空格。和#Stackoverflow'作为换行符或者carridge返回。
# ./test.sh
+ myvar='"Hello Stakeoverflow"'
+ ping '"Hello' 'Stakeoverflow"'
ping: unknown host "Hello
无论如何我可以覆盖这个吗?
忽略ping的使用,我知道你不能ping单词,它只是有助于绘制变量处理的例子作为shell命令的参数提供时所以我需要一个错误来显示
答案 0 :(得分:3)
内部引用对你没有好处 - 不要试图使用它们。在myvar="\"foo\""
的情况下,外引号是语法,但内引号是数据。 shell不会使用数据引用进行字符串拆分,并且它们以后不会再转换为语法(除非您使用eval
,这引入了许多新问题,其中许多是安全问题 - 影响);他们所做的就是添加你的实际命令不想要或不需要的数据。
你的扩展需要语法引用,以防止字符串拆分和glob扩展。比较这四个例子(只有第一个是正确的):
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>
答案 1 :(得分:0)
你需要双引号变量
ping "$myvar"