1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

シェルにおける$*と$@の違いの説明

2022-02-07 10:25:30

シェル特殊変数の項で示したように、$*と$@はどちらも関数やスクリプトに渡されるすべての引数を表しますので、この項では両者の違いに焦点を当てます。

と$@が二重引用符 ""で囲まれていない場合は、両者に違いはなく、どちらも受け取った各引数をスペースで区切られた1つのデータとして扱います。

しかし、二重引用符 " " で囲むと、次のような違いがあります。

"∗ "は、各パラメータを1つのデータとして扱うのではなく、すべてのパラメータを全体として扱います。 "*" は、各パラメータを1つのデータとして扱うのではなく、すべてのパラメータを1つのデータとして扱います。"∗" は、各パラメータを1つのデータとして見るのではなく、すべてのパラメータを全体として見ます。 "@" は、依然として各パラメータを互いに独立した1つのデータとして扱います。

例えば、5つのパラメータが渡された場合、"* "では5つのパラメータが組み合わされて1つのデータとなり、互いに区別がつかなくなり、"* "では、5つのパラメータが組み合わされて1つのデータとなり、互いに区別がつかなくなり、" ∗ "の場合は5つのパラメータが統合されて1つのデータとなり、互いに区別がつかなくなり、"@"の場合は5つのパラメータが互いに独立して、5つのデータとなるのだそうです。

echo で直接 "∗ " と "*" と "@" を出力して比較すると違いが分かりませんが、for ループで一つずつ出力すると違いが一目瞭然になります。


#! /bin/bash

echo "--- \$* demo ---"
for i in "$*"; do
 echo $i
done

echo "-- \$@ demo ---"
for i in "$@"; do
 echo $i
done



スクリプトを実行すると、次のような出力が得られます。

$ chmod +x test.sh
$ . /test.sh 1 2 3
-- $* デモ ---
1 2 3
-- $@ デモ ---。
1
2
3

シェル$*と$@の違いについての説明は以上となります。Shell $* $@ の詳細については、Script House の過去記事を検索するか、以下の記事を引き続きご覧ください。