4

当我在编写 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,请参阅下面的答案。

4

3 回答 3

6

更新,感谢@jordanm,我意识到这是 bash 和旧 sh 版本之间的区别。

这是 bash 或 sh 4.2 中的解决方案。在旧的 sh 中,这可能不起作用。

  33 func3()                                                                         
  34 {                                                                               
  35     local a=("${@}")                                                            
  36                                                                                 
  37     for i in "${a[@]}"; do                                                      
  38         echo "$i ****"                                                          
  39     done                                                                        
  40 }        
于 2012-11-18T23:05:27.343 回答
0
于 2013-11-20T01:42:50.807 回答
-2

如果您想将所有内容都保留在引号中,可以尝试以下操作:

test() {
    local args="$@"
    for i in `echo "$args"`;  do
        echo "$i ****"
    done
}

test 1 2 3 4

输出:

~ $ ./test.sh 
1 ****
2 ****
3 ****
4 ****
于 2012-11-18T23:02:19.027 回答