我认为我没有完全理解 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