Linux‎ > ‎

シェル - 引数関連のコマンドと変数

引数関連のコマンド

コマンド 内容
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つの引数と扱いたい場合にのみ「$*」を使う、など用途を考慮したコーディングルールを定めておいたほうがいいでしょう。