1

举个小例子:

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

这样做的结果是,任何命令(此处只是 ping 示例)都会自动将 'Hello' 和 'Stackoverflow' 之间的空格视为换行符或回车符。

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

无论如何我可以忽略这个吗?

忽略 ping 的使用,我知道你不能 ping 单词,它只是有助于绘制关于变量作为参数提供给 shell 命令时如何处理的示例,所以我需要一个错误来显示这一点。

4

2 回答 2

3

内部引号对你没有好处——不要试图使用它们。在 的情况下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

于 2013-03-19T17:28:12.123 回答
0

你需要双引号变量

ping "$myvar"
于 2013-03-19T17:21:09.673 回答