引数関連のコマンド
コマンド |
内容 |
getopts |
オプション解析コマンド |
shift |
引数を左に1つ(もしくは任意の数)ずらす |
set |
変数の表示・変数の設定・引数の再設定 |
unset |
変数の開放 |
引数関連の変数
表記 |
内容 |
$0 or ${0} |
シェル名。 |
$n or ${n} |
シェル引数のn番目の値。「{}」で囲まなくていいのは0~9まで。 |
$# or ${#} |
引数の数。 |
$@ or ${@} |
すべての引数。ただし、空白が含まれる引数があるばあに「"」でくくると、個別に展開される。(※1) |
$* or ${*} |
すべての引数。空白が含まれる引数があるばあに「"」でくくると、まとめて展開される。(※1) |
すべての変数は「${・・・}」という表記法で書くことが出来ます。また、多くの場合、「{}」を省略することが出来ます。一般的な変数や引数の参照の場合には、「{}」が必要な場面があります。そのため、コーディングルールとしては原則「{}」をつけると統一したほうがいいかもしれません。一方で、「$#」「$@」「$*」は「{}」でくくる必要が発生することがありません。よって、こちらは「{}」無しで記述すると統一することが望ましいでしょう。
(※1)「$@」と「$*」には性質の違いがあります。多くの場合は気にする必要はないでしょう。しかし、違いを認識しておくことは重要です。
argsSample.sh
./argsSampleSub.sh $@ # (1)
./argsSampleSub.sh $* # (2)
./argsSampleSub.sh "$@" # (3)
./argsSampleSub.sh "$*" # (4)
argsSampleSub.sh
echo $#
上記の2つのシェルに対し、以下のようにシェルを実行します。
./argsSample.sh "x y" z
つまり各引数はこうなっています。
第一引数:x y
第二引数:z
(1)と(2)は引数3と判断します。
(3)は引数2と判断します。
(4)は引数1と判断します。
引数の構成を変えずに、子シェルに渡す方法は「"$@"」だけということになります。差異が現れるのは1つの引数内に空白が含まれている場合なので、実際にこのようなケースに直面することは少ないかもしれません。しかし、違いがあることを理解しておくことは重要です。
また、原則「$@」を使うようにしておき、すべての引数をまとめて1つの引数と扱いたい場合にのみ「$*」を使う、など用途を考慮したコーディングルールを定めておいたほうがいいでしょう。
|
|