Bash将空白视为新行

时间:2013-03-19 17:18:08

标签: bash

举一个小例子:

#!/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命令的参数提供时所以我需要一个错误来显示

2 个答案:

答案 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>

另见http://mywiki.wooledge.org/BashFAQ/050

答案 1 :(得分:0)

你需要双引号变量

ping "$myvar"