在 bash 中,$@ 和 "$@" 有什么区别?

  • 本文关键字:区别 bash linux bash terminal
  • 更新时间 :
  • 英文 :


我知道$@给出了所有传递参数的值。假设传递的参数是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变成一对令牌,而不是一个令牌

最新更新