4

私がシェルスクリプトに取り組んでいるとき、私は $@ と "$@" の問題に少しイライラしています。そこで、シェル スクリプトを作成してテストを行います。次のように。

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で行ったように文字列を使用することです。ローカルa = "$ a"; $a の i の場合。行う ...

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 に答える