このエントリーをはてなブックマークに追加


シェルの特殊変数である$*と$@の違い

シェルスクリプトに渡された引数を展開する、$* と $@ の動作の違いについて以下に記述します。


関連記事

ダブルクォーテーションで囲むと動作が違ってくる

以下のサンプルスクリプトを使い、 $* と $@ の違いを説明します。

サンプルシェルスクリプト

#!/bin/bash

echo '== $* test =='
for arg in $*
do
  echo $arg
done

echo '== "$*" test =='
for arg in "$*"
do
  echo $arg
done

echo '== $@ test =='
for arg in $@
do
  echo $arg
done

echo '== "$@" test =='
for arg in "$@"
do
  echo $arg
done

実行結果(その1)

以下の実行結果を見た結果のまとめ

  • $*, $@, "$@" は全て同様な動作となっており、3つの引数が分割されて格納されているのが確認できます。
  • "$*" はサンプルシェルスクリプトに与えた3つの引数を分解せずに1つとして格納されているのが確認できます。
$ ./arg.sh 1 2 3
== $* test ==
1
2
3
== "$*" test ==
1 2 3
== $@ test ==
1
2
3
== "$@" test ==
1
2
3

実行結果(その2)

以下の実行結果を見た結果のまとめ

  • $*, $@ は同様な動作となっており、ダブルクォーテーションで2つの引数としてシェルスクリプトに渡しましたが、すべて区切り文字で展開され6つに分解されています。
  • "$*" はサンプルシェルスクリプトに与えた2つの引数を分解せずに1つとして格納されているのが確認できます。
  • "$@" はダブルクォーテーションで2つの引数として渡したので2つに分解され格納されています。
$ ./arg.sh "1 2 3" "a b c"
== $* test ==
1
2
3
a
b
c
== "$*" test ==
1 2 3 a b c
== $@ test ==
1
2
3
a
b
c
== "$@" test ==
1 2 3
a b c

まとめ

  • $*, $@ と記述した場合は、どちらも同様の動作となる。
  • ダブルクォーテーションで囲んで複数の引数を渡す場合は、"$*" と "$@" では動作が異なってしまう。

以上、$*, $@ の違いでした。



添付ファイル: filearg.sh 555件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-03-20 (金) 22:26:54