当我在编写 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 vs linux sh。
我可能是错的,如果是这样,请指出,非常感谢。
在旧的 sh,freebsd sh 中,我们没有数组,显然,数组赋值无法正常工作,另一种方法是像我在 func000 中所做的那样使用字符串,local a="$a"; 对于我在 $a 中;做 ...
如果使用 linux sh 4.5(已测试)或 bash,请参阅下面的答案。