人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

シェルスクリプトで、
「$*」と「$@」の違いがよくわかりません。
違いを実感できるような実例を教えてください。

●質問者: hina1981
●カテゴリ:コンピュータ
✍キーワード:シェルスクリプト
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● きゃづみぃ
●20ポイント

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

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

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

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

◎質問者からの返答

ありがとうございます。

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

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

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


--$*を使う例

#!/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

--


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

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


2 ● ootatmt
●30ポイント

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

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

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

◎質問者からの返答

ありがとうございます。

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

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

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


3 ● noita
●30ポイント

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

◎質問者からの返答

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


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

妙に新鮮に感じました。

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ