シェルスクリプトで、

「$*」と「$@」の違いがよくわかりません。
違いを実感できるような実例を教えてください。

回答の条件
  • 1人3回まで
  • 登録:2006/09/29 09:23:37
  • 終了:2006/09/29 15:56:17

回答(3件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982006/09/29 09:27:57

ポイント20pt

http://www.rhythm-cafe.com/shell/Grammer04.aspx

$* 全引数リスト。ダブルクォートで囲んだ場合、"$1 $2 … $n" と全引数を一つにくっつけた物に展開される。

$@ 全引数リスト。ダブルクォートで囲んだ場合、"$1" "$2" … "$n" とそれぞれの引数を個別にダブルクォートで囲んで展開する。

""で 囲う範囲の違いですね。

id:hina1981

ありがとうございます。

すみません、説明が足りませんでした、

ダブルクォートで囲むことによる違いがよくわからないのです。

試しに、下記のようなシェルスクリプトを書いてみたのですが、全く動作が同じであったので、混乱しています。


--$*を使う例

#!/bin/sh

for i in $*

do

echo $i

done

--


--$@を使う例

#!/bin/sh

for i in $@

do

echo $i

done

--


私の予定としては、上の例は引数が一つとして認識されるので、

一度しかループしない。

下の例は、引数が一つ一つ展開されるので、引数の数だけループすると思っていたのですが……。



下記のように書き換えたところ、想定していた通りに動きました。

--$*を使う例

#!/bin/sh

for i in "$*"

do

echo $i

done

--


--$@を使う例

#!/bin/sh

for i in "$@"

do

echo $i

done

--


すみません、自己解決してしまいました。

ただ、この違いは、どのようなときに有効なのでしょうか?

2006/09/29 10:02:32
id:ootatmt No.2

ootatmt回答回数1307ベストアンサー獲得回数652006/09/29 09:46:25

ポイント30pt

ここの説明が分かりやすいと思います。

http://www.atmarkit.co.jp/flinux/rensai/shell05/parameter.html

後半の「その他の特殊変数」をご参照ください。

id:hina1981

ありがとうございます。

知らなかった概念や言葉があり、後半以外もいろいろ参考になりました。

IFS変数ってものがあるのですね。

おぼろげながら違うものだと認識できるようになってきました。

2006/09/29 09:57:56
id:noita No.3

noita回答回数23ベストアンサー獲得回数12006/09/29 12:06:01

ポイント30pt

ちなみにcshの場合、$@は使えず、$*のIFS変数も無効みたいです。

id:hina1981

cshだと、そんな仕様なのですね。


試しに使っているLinuxのシェルをcshに変えてみたのですが、cshのsetコマンドの結果って少ないですね~。

妙に新鮮に感じました。

ありがとうございました。

2006/09/29 15:55:32

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません