当我在编写shell脚本时,$@和"$@"问题让我有些沮丧。因此,我编写了一个shell脚本进行一些测试,如下所示。
func()
{
local a="$@"
for i in "$a"; do
echo "$i ****"
done
}
func000()
{
local a="$@"
for i in $a; do
echo "$i ****"
done
}
func0()
{
local a=$@
for i in "$a"; do
echo "$i ****"
done
}
func00()
{
local a=$@
for i in $a; do
echo "$i ****"
done
}
func1()
{
for i in "$@"; do
echo "$i ****"
done
}
func2()
{
for i in $@; do
echo "$i ****"
done
}
func "a b c"
func a b c
echo "-----------"
func0 "a b c"
func0 a b c
echo "-----------"
func00 "a b c"
func00 a b c
echo "-----------"
func000 "a b c"
func000 a b c
echo "-----------"
func1 "a b c"
func1 a b c
echo "-----------"
func2 "a b c"
func2 a b c
a b c ****
a b c **** func
-----------
a b c **** func0
a b c ****
-----------
a **** func00
b ****
c ****
a ****
b ****
c ****
------------
a **** func000
b ****
c ****
a ****
b ****
c ****
-----------
a b c **** func1 //this has the result that I want.
a ****
b ****
c ****
-----------
a **** func2
b ****
c ****
a ****
b ****
c ****
据我所记,在使用 $@ 时,我们必须使用双引号,否则会出现一些问题。因此,我知道某些函数肯定不能正常工作。(无论如何,我仍然测试它)。
只有 func1 给我想要的结果,但问题是我想将 "$@" 分配给一个变量。通过查看 func0、func000、func0、func00 的结果,没有一个能给我正确的东西。因此,我希望有人能帮帮我。
此外,我知道 sh 和 bash 有区别。如果有人能指出在哪种情况下会出现问题,我将非常高兴。谢谢。
更新:
我应该说,这个脚本的结果取决于 bash 或 sh 的版本,或者 freebsd sh 与 linux sh 的版本。
我可能是错的,如果是这样,请指出来,非常感谢。
在旧版 sh、freebsd sh 中,我们没有数组,显然,数组赋值不能正常工作,替代方案是像我在 func000 中所做的那样,用字符串来定义变量,例如 local a="$a"; for i in $a; do ...。
如果使用 linux sh 4.5(已测试)或 bash,请参见我的答案。
$@
不是一个数组(例如${@[1]}
是非法的)。然而,当被引用时,它的行为是特殊的,类似于数组:"$@"
等同于"$1" "$2" "$3" ...
(与"$*"
相反,后者基本上等同于"$1 $2 $3 $4"
)。 - chepnerlocal -a a=( "$@" )
。 - Charles Duffy/bin/sh
中运行,因为数组是扩展...就像local
关键字一样,尽管它很常见,我记得甚至ash也有它)。 - Charles Duffy