猛砸看到的空白为新线
问题描述:
拿这个小例子:猛砸看到的空白为新线
#!/bin/bash -x
myvar="\"Hello *\""
ping $myvar
这样做的结果是,任何命令(ping命令只是举例这里)将自动看到“你好”和“#1”之间的空白作为换行符或回车符。
# ./test.sh
+ myvar='"Hello Stakeoverflow"'
+ ping '"Hello' 'Stakeoverflow"'
ping: unknown host "Hello
有反正我可以忽略这个吗?
忽略ping的使用,我知道你不能ping字,它只是帮助我们绘制变量如何作为shell命令的参数提供的处理方式,所以我需要一个错误来显示它。
答
内部引号对你没有好处 - 不要尝试使用它们。在myvar="\"foo\""
的情况下,外部引号是语法,但内部引号是数据。作为数据的引号不被shell用于字符串分割目的,并且它们以后不会再回到语法中(除非使用eval
,这会引入大量新问题,其中许多会影响安全性)。他们所做的只是添加实际命令不需要或不需要的数据。
您需要句法引号围绕您的扩展来防止字符串拆分和glob扩展。比较这四个例子(仅其中第一个是正确的):
do_something_with() {
printf '<%s> ' "[email protected]"
echo
}
myvar="Hello *"
do_something_with "$myvar" # output: <Hello *>
do_something_with $myvar # output: <Hello> <*>
myvar2="\"Hello *\""
do_something_with $myvar2 # output: <"Hello> <*">
do_something_with "$myvar2" # output: <"Hello *">
如果你想存储的东西应该在一个变量被解释为多个参数,使用正确的事情是一个数组:
my_array=(Hello "Stack Overflow")
do_something_with "${my_array[@]}" # output: <Hello> <Stack Overflow>
答
需要双引号的变量
ping "$myvar"
非常感谢您花时间为我概述这些。双引号变量做了这个工作! – devnull 2013-03-21 12:15:33