2017-08-30 98 views
1

以下是空脚本替换为单引号的脚本。如果变量不为空,那么我们有正确的替代。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

单引号不被介绍,他们只是用来告诉你,你是通过一个空的论点。您使用的双引号引起空参数传递。如果你不想要的说法,但要允许在变量的空白,你必须做一些事情,如:

curl ${aa:+"$aa"} -vvv 

这是不同于curl ${aa+"$aa"} -vvv当aa是空字符串,但是从你的描述似乎你想要前者。

+0

谢谢。为什么curl会用一个实际的论证来解释一个空的论证或空间?它不应该忽略它吗?这是一个卷曲问题还是shell问题? – Khanna111

+1

如果您将空字符串作为参数传递,那么这就是传递的参数。为什么要卷曲忽略它?这既不是壳问题,也不是卷毛问题;这是一个使用错误。您正在传递curl一个空参数,并且curl(IMO正确)不会以特殊方式处理该参数,但会尝试将空字符串用作url。 –

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