私がシェルスクリプトに取り組んでいるとき、私は $@ と "$@" の問題に少しイライラしています。そこで、シェル スクリプトを作成してテストを行います。次のように。
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 を使用している場合は、以下の回答を参照してください。