bash 对于特殊变量有不同的弱引用规则吗?

bash 对于特殊变量有不同的弱引用规则吗?

我认为我没有完全理解 bash 中引用的细微差别。

我有一个脚本,foo.sh它只输出编号的参数。

#!/bin/bash

i=1
while [ $i -le $# ] ; do
    v=$(eval "echo \$$i")
    echo "$i: $v"
    i=$((i + 1))
done

你可以像这样使用它:

me@localhost] ./foo.sh a b c
1: a
2: b
3: c

如果我将变量设置args为包含空格的值(如"super nintendo"),我可以使用不引用让 bash 将其视为两个参数:

me@localhost] args="super nintendo" ; ./foo.sh $args
1: super
2: nintendo

或者我可以使用弱引用(双引号)让 bash 将其视为单个参数,但将变量扩展为实际值:

me@localhost] args="super nintendo" ; ./foo.sh "$args"
1: super nintendo

或者我可以使用强引用(单引号)按字面意思对待它:

me@localhost] args="super nintendo" ; ./foo.sh '$args'
1: $args

然而,弱引用特殊变量$@似乎就像没有引用一样。例如,bar.sh下面调用foo.sh两次,一次使用弱引用,一次不使用引用。

#!/bin/bash

./foo.sh "$@"
./foo.sh $@

调用此命令./bar.sh a b c会为两次调用产生相同的输出foo.sh

1: a
2: b
3: c
1: a
2: b
3: c

我什么预期的看到的是以下内容:

1: a b c
1: a
2: b
3: c

我在 bash 中引用缺少什么?

答案1

这是因为$@是一个数组,并且数组的引用有不同的规则:

  • "${array[@]}""$@"扩展到数组的成员
  • "${array[*]}""$*"扩展到由变量的第一个字符连接的数组元素$IFS

尝试使用多个参数,其中一些包含空格:

./foo.sh 'one two' three

相关内容