2013-03-19 42 views
1

拿这个小例子:猛砸看到的空白为新线

#!/bin/bash -x 
myvar="\"Hello Stackoverflow\"" 
ping $myvar 

这样做的结果是,任何命令(ping命令只是举例这里)将自动看到“你好”和“#1”之间的空白作为换行符或回车符。

# ./test.sh 
+ myvar='"Hello Stakeoverflow"' 
+ ping '"Hello' 'Stakeoverflow"' 
ping: unknown host "Hello 

有反正我可以忽略这个吗?

忽略ping的使用,我知道你不能ping字,它只是帮助我们绘制变量如何作为shell命令的参数提供的处理方式,所以我需要一个错误来显示它。

回答

3

内部引号对你没有好处 - 不要尝试使用它们。在myvar="\"foo\""的情况下,外部引号是语法,但内部引号是数据。作为数据的引号不被shell用于字符串分割目的,并且它们以后不会再回到语法中(除非使用eval,这会引入大量新问题,其中许多会影响安全性)。他们所做的只是添加实际命令不需要或不需要的数据。

您需要句法引号围绕您的扩展来防止字符串拆分和glob扩展。比较这四个例子(仅其中第一个是正确的):

do_something_with() { 
    printf '<%s> ' "[email protected]" 
    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

+0

非常感谢您花时间为我概述这些。双引号变量做了这个工作! – devnull 2013-03-21 12:15:33