Linux bash空变量命令替换导致一个引号
下面是一个用单引号替换空变量的脚本。如果变量不是空的,那么我们有正确的替换Linux bash空变量命令替换导致一个引号,linux,bash,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 问题1:为什么一个空
$ 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
问题1:为什么一个空变量或一个带空格的变量会导致引入单引号?
问题2:如何防止用单引号代替空变量
现在,我可以删除双引号,一切正常,但如果有空格,我需要保留空格
谢谢。您看到的是单引号,因为您在
$aa
周围使用了双引号,所以curl将空字符串视为参数。如果像这样删除双引号,则不会获得此效果:
set -x; aa=""; bb=`curl $aa -vvv`; set +x
之所以看到单引号,是因为在
$aa
周围使用了双引号,所以curl将空字符串视为参数。如果像这样删除双引号,则不会获得此效果:
set -x; aa=""; bb=`curl $aa -vvv`; set +x
这是因为您将变量替换括在双引号中
$aa
扩展为空字符串,该字符串放入引号中,因此生成的引号中没有任何内容。在本例中,curl
将按顺序看到3个参数:curl
,
,-vvv
如果在$aa
中删除双引号,则第二个参数将不会传递给curl
,并且在其主函数的argv
参数中只会看到curl
和-vvv
:
$ set -x; aa=""; bb=`curl $aa -vvv`; set +x
+ aa=
++ curl -vvv
这是因为您将变量替换括在双引号中
$aa
扩展为空字符串,该字符串放入引号中,因此生成的引号中没有任何内容。在本例中,curl
将按顺序看到3个参数:curl
,
,-vvv
如果在$aa
中删除双引号,则第二个参数将不会传递给curl
,并且在其主函数的argv
参数中只会看到curl
和-vvv
:
$ set -x; aa=""; bb=`curl $aa -vvv`; set +x
+ aa=
++ curl -vvv
单引号并没有被引入,它们只是用来显示您正在传递一个空参数。使用的双引号导致传递空参数。如果不需要参数,但希望在变量中允许空白,则必须执行以下操作:
curl ${aa:+"$aa"} -vvv
当aa是空字符串时,这不同于
curl${aa+“$aa”}-vvv
,但是从您的描述来看,您似乎想要前者。没有引入单引号,它们只是用来向您显示您正在传递一个空参数。使用的双引号导致传递空参数。如果不需要参数,但希望在变量中允许空白,则必须执行以下操作:
curl ${aa:+"$aa"} -vvv
当aa为空字符串时,这不同于
curl${aa+“$aa”}-vvv
,但从您的描述来看,您似乎想要前者。注意,关闭双引号也意味着变量的值将进行分词和通配符扩展,这可能会导致意外行为。请注意,关闭双引号也意味着变量的值将进行分词和通配符扩展,这可能会导致意外行为。谢谢。为什么curl会用实际参数解释空参数或空格?它不应该忽视它吗?这是一个curl问题还是shell问题?如果您将空字符串作为参数传递,那么这就是传递的参数。为什么curl应该忽略它?这既不是外壳问题,也不是卷曲问题;这是一个使用错误。您正在向curl传递一个空参数,curl(正确地说)不会以特殊方式处理该参数,而是尝试将空字符串用作url。谢谢。为什么curl会用实际参数解释空参数或空格?它不应该忽视它吗?这是一个curl问题还是shell问题?如果您将空字符串作为参数传递,那么这就是传递的参数。为什么curl应该忽略它?这既不是外壳问题,也不是卷曲问题;这是一个使用错误。您正在向curl传递一个空参数,curl(正确地说)不会以特殊方式处理该参数,而是尝试将空字符串用作url。