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,最后一个参数的展开式与最后一个参数联接
原词的一部分。如果没有位置参数,
“$@”和“$@展开为零(即,它们被删除)
具体而言:
- 当展开发生在双引号内时,每个参数展开为一个单独的字
- 如果双引号展开发生在单词内,则第一个参数的展开与原始单词的开头部分连接,最后一个参数的展开与原始单词的最后部分连接
$*
*
展开到位置参数,从一开始。当展开发生在双引号内时,它
扩展为单个单词
每个参数的值由
IFS特殊变量。也就是说,“$*”相当于“$1c$2c…”,
其中c是IFS变量值的第一个字符。如果
如果未设置,则参数用空格分隔。如果IFS为空,
这些参数是在不插入分隔符的情况下合并的
为了进一步说明,请尝试以下内容:
set--“ted carol”“alice bob”;printf“%s\n”你好$@world“