Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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
Bash 即使使用双引号,也会发生分词_Bash - Fatal编程技术网

Bash 即使使用双引号,也会发生分词

Bash 即使使用双引号,也会发生分词,bash,Bash,据 使用双引号防止分词。 用双引号括起来的论点本身就是一个单词, 即使它包含空格分隔符 然而,我有 0> /bin/bash --version GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu) [...] 1> cat inspect.sh #!/bin/bash echo "first argument is $1" echo "second argument is $2" 2> cat test.sh

使用双引号防止分词。 用双引号括起来的论点本身就是一个单词, 即使它包含空格分隔符

然而,我有

0> /bin/bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
[...]

1> cat inspect.sh 
#!/bin/bash
echo "first argument is $1"
echo "second argument is $2"

2> cat test.sh 
#!/bin/bash
set -x
./inspect.sh "hello $@"

3> ./test.sh alice bob
+ ./inspect.sh 'hello alice' bob
first argument is hello alice
second argument is bob

4> ./test.sh "alice bob"
+ ./inspect.sh 'hello alice bob'
first argument is hello alice bob
second argument is 

我想知道为什么3>和4>有不同的结果?如何修改test.sh以使3>具有与4>相同的输出?

答案是
$@
是特殊的

本节:

@

展开到位置参数,从一开始。当展开发生在双引号内时,每个 参数展开为 单独的词。也就是说,“$@”相当于“$1”$2”…。如果 双引号展开发生在一个单词中,即 第一个参数与原始参数的开始部分连接 word,最后一个参数的展开式与最后一个参数联接 原词的一部分。如果没有位置参数, “$@”和“$@展开为零(即,它们被删除)

具体而言:

  • 当展开发生在双引号内时,每个参数展开为一个单独的字

  • 如果双引号展开发生在单词内,则第一个参数的展开与原始单词的开头部分连接,最后一个参数的展开与原始单词的最后部分连接
这两个参数的组合将使您将“hello”合并到第一个参数,并将“hello”合并到最后一个参数,但每个参数都扩展到自己的单词

如果要将所有参数展开为一个单词,则需要使用
$*

*

展开到位置参数,从一开始。当展开发生在双引号内时,它 扩展为单个单词 每个参数的值由 IFS特殊变量。也就是说,“$*”相当于“$1c$2c…”, 其中c是IFS变量值的第一个字符。如果 如果未设置,则参数用空格分隔。如果IFS为空, 这些参数是在不插入分隔符的情况下合并的


为了进一步说明,请尝试以下内容:
set--“ted carol”“alice bob”;printf“%s\n”你好$@world“