web-dev-qa-db-ja.com

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

このページ によると、$ @と$ *はほとんど同じことを行います:

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

グーグルですべてのトップヒットを検索した後、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

70
spuder

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

 > ./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

ここでは、パラメーターは1つの長い引用符付き文字列と見なされます。引用なし:

Using $*:
one
two
three
four

文字列は、forループによって単語に分割されます。

Using "$@":
one
two
three four

これは、$ @の各要素を引用符付きの文字列として扱います。

Using $@:
one
two
three
four

これは、各要素を引用符で囲まれていない文字列として扱うため、最後の要素はfor three four

100
goldilocks

違いは、それらが拡張される方法にあります。

$*は、すべての要素がスペースで区切られた単一の引数に展開されます(実際には$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>
14
Patrick

詳細については、 Bash初心者向けガイド を確認してください。これらは、分離方法が異なるだけでほとんど同じことを実行します。

$*-1つから開始して、位置パラメーターに展開します。二重引用符で囲まれた展開は、IFS特殊変数の最初の文字で区切られた各パラメーターの値を使用して単一のWordに展開されます。

$@-1つから開始して、位置パラメーターに展開します。展開が二重引用符で囲まれている場合、各パラメーターは個別のWordに展開されます。

しかし、IFSを他の値に設定しない限り、デフォルトは同じに見える可能性があります。

3
Karlson

どちらが優先されますか?

短い答えは"$@"です。

二重引用符なしでそれらを使用する場合、それらは同じです。この場合、他に優先する人はいない。ただし、正確に何をしたいかがわかっている場合を除き、常に二重引用符でそれらを使用することをお勧めします。

まったく同じことをする2つの組み込み変数があるのはなぜですか?

$*$@には違いはありませんが、"$@""$*"には違いがあります。

私の答えは この投稿 で確認でき、それらの違いを確認できます。

1
cuonglm