#navi(../)
* シェルの特殊変数である$*と$@の違い [#d381e1f2]
シェルスクリプトに渡された引数を展開する、$* と $@ の動作の違いについて以下に記述します。
#contents
#htmlinsertpcsp(linux_ads_top.html,linux-sp.html)

* 関連記事 [#p5619315]
-[[シェルの$特殊変数の一覧および説明>逆引きシェルスクリプト/$特殊変数の一覧および説明]]
-[[特殊変数$*と$@の違い>逆引きシェルスクリプト/特殊変数$*と$@の違い]]
-[[シェルでランダム値を使用する>逆引きシェルスクリプト/シェルでランダム値を使用する]]

* ダブルクォーテーションで囲むと動作が違ってくる [#z1fbb2e2]
以下のサンプルスクリプトを使い、 $* と $@ の違いを説明します。
** サンプルシェルスクリプト [#xf14b4a5]
#ref(arg.sh)

 #!/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) [#ae17c1d4]
以下の実行結果を見た結果のまとめ
- $*, $@, "$@" は全て同様な動作となっており、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) [#u74b4bef]
以下の実行結果を見た結果のまとめ
- $*, $@ は同様な動作となっており、ダブルクォーテーションで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

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

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

#htmlinsertpcsp(linux_ads_btm.html,linux-sp.html)

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS