Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux bash空变量命令替换导致一个引号_Linux_Bash - Fatal编程技术网

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。