スクリプトの引数

 スクリプトに引数を指定することもできます。例えば,カレント・ディレクトリにある通常ファイルfile1のファイル情報を詳細に出力するには,

と入力します。ここで,「ls」はコマンド名(第0番目の引数),「-l」はコマンド行オプション(第1番目の引数),「file1」はファイル名(第2番目の引数)です。

 スクリプトも同様に引数に番号が付き,シェル変数として参照できます。第1番目の引数は$1,第2番目の引数は$2といった具合です。参照できる引数は第9番目,すなわち$9までになります。また,スクリプト名自身は第0番目の引数,すなわち$0になります。

 また,スクリプトに指定された引数の数は,シェル変数$#で参照できます。指定したすべての引数をひとまとめにしたものはシェル変数$*で参照できます。

 例えば,架空のスクリプトexample_argに2個の引数を指定したと仮定すると,引数関連の各シェル変数には以下のような値あるいは文字列が格納されます。


図9 引数の参照例
[画像のクリックで拡大表示]

図10 実行結果
[画像のクリックで拡大表示]

 では,引数の個数が10以上あった場合にはどうなるのでしょうか。シェル変数は9しかありませんので,10番目以降の引数は捨てられてしまうのでしょうか。そんなことはありません。一度に参照できる引数の数が9までなだけです。

 一般に,スクリプトを実行する前に指定する引数が決まっていることはまれです。そのため,任意の個数の引数をスクリプト中で処理できる工夫を施したスクリプトを作成します。

 shiftコマンドとシェル変数$@を利用すると,任意の個数の引数を処理できます。shiftコマンドは,1回実行すると$2を$1に,$3を$2にというように,引数の番号を一つ移動します。よって,元の(shiftコマンドを実行する前の)$1の引数は捨てられることになります*15。このため,引数の数が10以上でも,shiftコマンドを実行することで,$9以下のシェル変数で順次参照できます。

 シェル変数$@は,$*と同様にすべての引数*16が格納されています。$*は引数をひとまとめにした文字列になりますが,$@では各引数が別の文字列として扱われます。

 具体的な例を示すことにしましょう。

 図9[表示]から分かるように,echoコマンドの引数指定した文字列に「*」および日本語が含まれており,「*」をシェルにメタキャラクタではないことを示すため,文字列全体を「'」で囲んであります。また,shiftコマンドを実行すると,引数は番号の若い順に1つずつ捨てられます。

 図9で示したスクリプトshow_argに3個の引数を指定した実行結果は図10[表示]のようになります。