bash空变量命令替换导致单引号
以下是空脚本替换为单引号的脚本。如果变量不为空,那么我们有正确的替代。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:如何防止单引号代替空变量?
现在,我可以删除双引号,一切正常,但我需要保留空格,如果有的话。
谢谢。
单引号不被介绍,他们只是用来告诉你,你是通过一个空的论点。您使用的双引号引起空参数传递。如果你不想要的说法,但要允许在变量的空白,你必须做一些事情,如:
curl ${aa:+"$aa"} -vvv
这是不同于curl ${aa+"$aa"} -vvv
当aa是空字符串,但是从你的描述似乎你想要前者。
由于您在$aa
附近使用了双引号,因此您会看到单引号,因此curl会将空字符串视为您的参数。如果您放弃这样的双引号,则不会得到此效果:
set -x; aa=""; bb=`curl $aa -vvv`; set +x
请注意,将双引号关闭也意味着变量的值将受到分词和通配符扩展的影响,这可能会导致意外的行为。 –
这是因为您已将变量替换括入双引号。 $aa
展开为空字符串,该字符串放置在引号中,因此不生成任何引号。在这种情况下,curl
将按顺序看到3个参数:curl
,<empty string>
,-vvv
。
如果去掉双引号轮$aa
,第二个参数将不会被传递到curl
,并且它只能看到curl
和-vvv
在argv
参数,它的主要功能:
$ set -x; aa=""; bb=`curl $aa -vvv`; set +x
+ aa=
++ curl -vvv
谢谢。为什么curl会用一个实际的论证来解释一个空的论证或空间?它不应该忽略它吗?这是一个卷曲问题还是shell问题? – Khanna111
如果您将空字符串作为参数传递,那么这就是传递的参数。为什么要卷曲忽略它?这既不是壳问题,也不是卷毛问题;这是一个使用错误。您正在传递curl一个空参数,并且curl(IMO正确)不会以特殊方式处理该参数,但会尝试将空字符串用作url。 –