bash sh特殊参数$ @"$ @",将"$ @"保存到变量中

kai*_*rhl 3 bash sh

当我在使用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 ****
Run Code Online (Sandbox Code Playgroud)

据我记得,当使用$ @时,我们必须使用双quoate,否则会出现问题.因此,我知道一些功能肯定不能正常工作.(我仍然测试它)

只有func1给了我一个渴望的结果,但是,我想把"$ @"分配给一个变量.通过查看func0,func000,func0,func00结果,这些都没有给我正确的东西.所以,我希望有人可以帮助我.

另外,我知道sh和bash有区别.如果有人能指出我哪些情况会破坏我会很高兴.谢谢.


更新

我应该说,这个脚本的结果,它来到bash或sh的版本,或者freebsd sh vs linux sh.

我可能是错的,如果是的话,请指出来,非常感谢.

在旧的sh,freebsd sh中,我们没有数组,显然,数组赋值无法正常工作,另一种方法是使用我在func000中执行的字符串,本地a ="$ a"; 因为我在$ a; 做......

如果使用linux sh 4.5(已测试)或bash,请参阅下面的答案.

kai*_*rhl 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 }        
Run Code Online (Sandbox Code Playgroud)