私が理解して読んでいると、$@
「arg1」「arg2」「arg3」に変わります。
しかし、引用すると、場合によっては奇妙な動作をするようです。
テスト1、$ @
$ function somefunc { sh -c "echo $@"; }
$ somefunc 1 2 3
> + somefunc 1 2 3
> + sh -c 'echo 1' 2 3
> 1
期待される出力は123で、取得する出力は1です。これで、何らかの理由でecho 1
コマンドとしてのみ渡されるように見えますが、なぜ"echo "1" "2" "3""
それになるのでしょうか。echo
「beforeecho」が「before1.Test 2、$ * 」によって閉じられる可能性があるため、私はおそらく予想していました。
$ function somefunc { sh -c "echo $*"; }
$ somefunc 1 2 3
> + somefunc 1 2 3
> + sh -c 'echo 1 2 3'
> 1 2 3
これは非常に明白であり、念のために機能します。結局のところ、$*
では1 2 3
なく"1" "2" "3"
。
テスト3、$@および$*
$ function somefunc { sh -c "echo $@ $*"; }
$ somefunc 1 2 3
> + somefunc 1 2 3
> + sh -c 'echo 1 2 3 1 2 3'
> 1 2 3 1 2 3
これはまた奇妙なことに十分に機能するようです。しかし、私はどのよう"echo "1" "2" "3" 1 2 3"
に変化するのかわからず'echo 1 2 3 1 2 3'
、それだけの「パターン」に従わない"echo $@"
。
テスト4、$@と文字列
$ function somefunc { sh -c "echo $@ hi"; }
$ somefunc 1 2 3
> + somefunc 1 2 3
> + sh -c 'echo 1' 2 '3 hi'
> 1
これもまた、考えても、結局のところ文字列に変わる"echo $@"
のとほとんど同じです。
また、私を困惑させるのは、それがに変わったことです。最初のテストでは、 (周囲の2つがなければ)"echo $@ $*"
$*
'echo 1' 2 '3 hi'
'echo 1' 2 3 hi
'
3 hi
テスト5、$@および$var
$ var="hi"
> + var=hi
$ function somefunc { sh -c "echo $@ $var"; }
$ somefunc 1 2 3
> + somefunc 1 2 3
> + sh -c 'echo 1 2 3 hi'
> 1 2 3 hi
これは再び機能します。したがって$@
、別の変数がそれに続く場合は機能するようです。
テストは、の代わりに、su user -c
またはbash -c
その代わりに行うこともできるsh -c
ので、次の指定された引数を実行する他のすべてのコマンドもあると思います。
私は今、それからある種の行動を得たようです
が、私はまだこの行動を理解していません。
ここで何が欠けていますか?