bash空变量命令替换导致单引号

时间:2017-08-30 00:50:19

标签: linux bash

以下是一个脚本,其中空变量由单引号替换。如果变量不为空,那么我们有正确的替换。

$ 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:如何防止单引号代替空变量?

现在,我可以删除双引号,一切正常但我需要保留空格,如果有的话。

感谢。

3 个答案:

答案 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中只会显示-vvvargv它的主要功能参数:

$ set -x;  aa=""; bb=`curl $aa -vvv`; set +x
+ aa=
++ curl -vvv