2014年1月25日土曜日

シェルスクリプトの全引数リスト $*, "$*", $@, "$@" の違い

シェルスクリプトで全引数リストをまとめて扱う変数は「$*」と「$@」がある。色々なサイトで解説があるが、自分の理解のため実際にスクリプトを書いて実験してみた。

用意したスクリプトはこちら:

test.sh
#!/bin/sh

print_arguments() {
  echo "\$1: $1"
  echo "\$2: $2"
  echo "\$3: $3"
  echo ""
}

test_pattern() {
  echo '$*'
  print_arguments $*

  echo '"$*"'
  print_arguments "$*"

  echo '$@'
  print_arguments $@

  echo '"$@"'
  print_arguments "$@"
}

echo 'arguments: "arg1 arg2" "arg3"'
echo ''
test_pattern "arg1 arg2" "arg3"

これを実行すると、次の結果が得られる。

[user@localhost]~% sh ./test.sh
arguments: "arg1 arg2" "arg3"

$*
$1: arg1
$2: arg2
$3: arg3

"$*"
$1: arg1 arg2 arg3
$2: 
$3: 

$@
$1: arg1
$2: arg2
$3: arg3

"$@"
$1: arg1 arg2
$2: arg3
$3: 

ダブルクオーテーションで囲わない場合、$*と$@は同じで、元のダブルクオーテーションは無視される。

ダブルクオーテーションで囲った場合、"$*"は元のダブルクオーテーションを無視して全部を一括りに囲ったように動作するけど、"$@"はもとのダブルクオーテーションと同じように各引数をダブルクオーテーションで括ったものとして動作する。

言葉に書いて文章にしてみれば他のサイトに書いてあることと結局同じだけれど、こういうのは自分で実験してみると理解が深まるね。

※この記事について指摘・意見・提案・感想などありましたら下のコメント欄にどうそ。

0 件のコメント:

コメントを投稿