我知道$@给出了所有传递参数的值。假设传递的参数是a, b, "c d"
,如果我一个接一个地打印它们,比如:
#!bin/bash
for i in $@
do
echo $i
done
则输出为:
a
b
c
d
而不是
a
b
c d
为什么只有当我用"$@"替换$@时它才起作用$@"?我想知道这背后的规则。是"$@"被认为是字符串?
这里有一个例子可以清楚地说明
外壳程序文件
# case 1
for i in $@;
do echo $i
done
# case 2
for i in "$@";
do echo $i
done
执行时,这是输出
$ bash p1.sh a b "c d"
a
b
c
d
a
b
c d
发生的情况是,正在调用的bash shell,首先是交互式shell将参数拆分为令牌。接下来,引号将被删除(请参阅https://www.gnu.org/software/bash/manual/html_node/Quote-Removal.html#Quote-移除(
传递给程序p1.sh的是这个令牌的无引号列表
在第一种情况下,真正发生的是
for i in a b c d;
在第二种情况下为
for i in "a" "b" "c d";
第三个令牌作为cSPACEd到达程序。我将文字空间字符(ASCII 0x20(写为space
但是,除非使用引号进行插值,否则SPACE被命令视为令牌之间的分隔符,因此cPACEd变成一对令牌,而不是一个令牌