$@と$*の違いは何ですか?

$@と$*の違いは何ですか?

~によるとこのページ、$ @、および$ *はほぼ同じことを行います。

The $@ holds list of all arguments passed to the script. 
The $* holds list of all arguments passed to the script.

Googleで人気のあるクエリをすべて検索した後も、重複しているように見える2つのフレーズがある理由の説明が見つかりません。

私のスクリプトでも同じ目的で使用されているようです。

cat foo.sh
#!/bin/bash
echo The parameters passed in are $@
echo The parameters passed in are $*

./foo.sh herp derp
The parameters passed in are herp derp
The parameters passed in are herp derp
  1. 一方が他よりも好まれますか?
  2. 同じ機能を実行する組み込み変数が2つあるのはなぜですか?

その他のソース
bash.cyberciti.biz

ベストアンサー1

彼らは違う。 $*単一の文字列$@ですが、実際の配列です。違いを確認するには、次のスクリプトを次のように実行します。

 > ./test.sh one two "three four"

スクリプト:

#!/bin/bash

echo "Using \"\$*\":"
for a in "$*"; do
    echo $a;
done

echo -e "\nUsing \$*:"
for a in $*; do
    echo $a;
done

echo -e "\nUsing \"\$@\":"
for a in "$@"; do
    echo $a;
done

echo -e "\nUsing \$@:"
for a in $@; do
    echo $a;
done              

4つのケースの説明と結果は次のとおりです。

最初の場合、パラメータは長いパラメータとして扱われます。リーダーひも:

Using "$*":
one two three four

ケース2(引用符を除く) - 文字列はループ内の単語で区切られますfor

Using $*:
one
two
three
four

ケース3 - $ @の各要素を引用符付き文字列として扱います。

Using "$@":
one
two
three four

最後の場合 - 各要素は引用符なしで文字列として処理されるため、最後の要素は再分割されますfor three four

Using $@:
one
two
three
four

おすすめ記事