以下是一个脚本,其中空变量由单引号替换。如果变量不为空,那么我们有正确的替换。
$ set -x; aa=""; bb=`curl "$aa" -vvv`; set +x
+ aa=
++ curl '' -vvv
要注意的是用单引号代替空变量。
当变量不为空时,一切正常,如:
$ set -x; aa="google.com"; bb=`curl "$aa" -vvv`; set +x
+ aa=google.com
++ curl google.com -vvv
Q1:为什么空变量或带空格的变量导致单引号被引入? Q2:如何防止单引号代替空变量?
现在,我可以删除双引号,一切正常但我需要保留空格,如果有的话。
感谢。
答案 0 :(得分:4)
没有引入单引号,它们只是用于向您显示您传递的是空参数。您使用的双引号导致传递空参数。如果你不想要参数但想要允许变量中的空格,你必须做类似的事情:
curl ${aa:+"$aa"} -vvv
当aa是空字符串时,这与curl ${aa+"$aa"} -vvv
不同,但是根据您的描述,您似乎想要前者。
答案 1 :(得分:1)
您看到的是单引号,因为您在$aa
周围使用了双引号,因此curl将空字符串视为您的参数。如果你删除这样的双引号,你将不会得到这种效果:
set -x; aa=""; bb=`curl $aa -vvv`; set +x
答案 2 :(得分:0)
这是因为您将变量替换括在双引号中。 $aa
扩展为空字符串,该字符串放在引号中,因此不会产生引号。在这种情况下,curl
将按顺序看到3个参数:curl
,<empty string>
,-vvv
。
如果您删除围绕$aa
的双引号,则第二个参数将不会传递给curl
,并且curl
中只会显示-vvv
和argv
它的主要功能参数:
$ set -x; aa=""; bb=`curl $aa -vvv`; set +x
+ aa=
++ curl -vvv