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

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

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

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

答え2

違いは拡張方式です。

$*すべての要素が空白(実際には最初の文字)で区切られた単一の引数に拡張されます$IFS
$@複数のパラメータに拡張されます。

例えば

#!/bin/bash
echo "With *:"
for arg in "$*"; do echo "<$arg>"; done
echo
echo "With @:"
for arg in "$@"; do echo "<$arg>"; done

 

$ /tmp/test.sh 1  2 "3  4"
With *:
<1 2 3  4>

With @:
<1>
<2>
<3  4>

答え3

あなたは見ることができますBash初心者ガイドより多くの情報を知りたいです。彼らはほとんど同じことをしますが、それは別の方法で分離されます。

$*- 1から始まる位置パラメータに展開されます。二重引用符内で拡張が発生すると、IFS特殊変数の最初の文字で区切られた各引数の値を使用して単一の単語に展開されます。

$@- 1から始まる位置パラメータに展開されます。二重引用符内で拡張が発生すると、各引数は別々の単語に展開されます。

IFSただし、デフォルト以外のものに設定しないと同じように見えます。

答え4

一方が他よりも好まれますか?

短い答えはです"$@"

二重引用符なしで使用すると同じです。この状況では、誰も他の人よりも優先されません。ただし、何が必要なのかを正確に知らない限り、常に二重引用符を使用することをお勧めします。

同じ機能を実行する組み込み変数が2つあるのはなぜですか?

$*との間に違いはありませんが$@、持っている"$@"もの"$*"と持っているものの間に違いはありません。

私の答えを見ることができます。この投稿彼らがどう違うかを確認してください。

関連情報