連載
» 2020年03月17日 05時00分 公開

“応用力”をつけるためのLinux再入門(39):シェルスクリプトに挑戦しよう(19)オプションの処理[その1]

今回のテーマは「オプション」です。まずは、外部コマンド「getopt」を使った処理を試してみましょう。シェルスクリプトでオプションを扱いたい場合に、どのような点に注意するか考えてみましょう。

[西村めぐみ,@IT]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「“応用力”をつけるためのLinux再入門」のインデックス

“応用力”をつけるためのLinux再入門

シェルスクリプトでオプションを使うには?

 本連載の第25回、第26回「シェルスクリプトに挑戦しよう(5)(6)」では、シェルスクリプトで引数を扱う方法を扱いました。今回は「オプション」を扱う方法です。

 オプションは、シェルスクリプトやコマンドに渡された引数のうち、「-n」や「--verbose」のように、コマンドの動作を指定する際に使用します。“ハイフン+1文字”、または“ハイフン2つ+文字列”で指定するのが一般的です()。「--file=ファイル名」のように、引数(オプション引数)を指定できるオプションもあります。

【※】「ps」コマンドのように「a」や「x」1文字で指定できたり、「find」コマンドの「-file」のようにハイフン1文字で何かを指定できたりするタイプのコマンドもあります。いずれにせよ、コマンドラインから受け取った文字列をどう使うかは、コマンド(の開発者)次第です。



 オプションは、引数に先立って指定するのが一般的です。また、一般的には順番を問わずに指定できますが、逆の意味を持つオプションの場合は後に指定したものが優先されるか、あるいは同時に使用できないなどの制限があるかもしれません。

 コマンドに対して、ここまではオプション、ここからは引数、と区別するために「--」を使う場合があります。引数として「-」から始まる文字列を使いたい場合などに使用します。

●短いオプションの書式

 「-n」のような“ハイフン+1文字”のオプションは、「短いオプション」や「ショートオプション」と呼ばれることがあります。

 引数付きの場合は、「-f ファイル名」のようにスペースで区切ってオプション引数を書きます。コマンドによっては、「-uユーザー名」のように短いオプションの後に、スペースを入れずに引数を続けて書く場合もあります()。

【※】どちらかの一方の書式しか受け付けないコマンドもあります。



 短いオプションは、1つにまとめることができます。例えば、「-a」と「-b」というオプションを指定する場合には、「-ab」あるいは「-ba」のように指定することがあります。

 複数をまとめて指定したオプションの中に引数を取るオプションがあると、その文字以降がオプションの引数として扱われます。

 例えば、「-a」「-b」と「-f ファイル名」というオプションがある場合、「-fab」と指定すると、「ab」が「-f」の引数として扱われることになります。従って、オプションを指定する際は、「-abf ファイル名」のように、引数を取るオプションを最後に書くのが一般的です。もちろん、「-ab -f ファイル名」のように分けて書くこともあるでしょう。

 なお、「-f」が引数を取るオプションの場合、「-f -a」と指定すると、「-f」の引数が指定されていないと解釈するか、「-a」を「-f」の引数と取るかも、コマンド次第になります。シェルスクリプトで引数を取るオプションを扱おうとする場合は、その点も考えて方針を定める必要があります。

 この他、短いオプションの場合、「-」記号の代わりに「+」記号を使うと意味が逆になるようになっている場合もあります。

●長いオプションの書式

 “ハイフン2つ+文字列”のオプションは、「長いオプション」や「ロングオプション」と呼ばれています。短いオプションと違い、複数をまとめて指定することはありません。

 引数がある場合、「--file=ファイル名」のように「=」(イコール)で区切るか、「--file ファイル名」のようにスペースに続けて引数を指定します。コマンドによっては「=」が必須ということもあります。

●オプションを解析するコマンド

 オプションの解析を補助してくれるコマンドに、「getopts」コマンド(連載:LinuxコマンドTips 第378回)や「getopt」コマンド(同第379回同第380回)があります。

 getoptsはbashのビルトインコマンドで、短いオプションの解析が可能です。まとめて指定されたオプションにも対応しています。また、引数付きのオプションを扱うことも可能で、この場合、「引数は必須」「オプションの後に続けて、またはスペース区切りで引数を書く」というルールで解析されます。

 getoptは外部コマンド(/usr/bin/getopt)で、短いオプションと長いオプションに対応しています。短いオプションはgetoptsと同様、まとめた指定や引数指定が可能です。

 長いオプションの場合は、「引数が必須」と「引数は任意」(あってもなくてもよい)という設定が可能です。オプション引数はスペース区切りまたはイコール区切りで指定します。

 なお、「引数が任意」の場合、イコール区切りではそのオプションの引数として扱われるのに対し、スペース区切りではオプション引数ではなく、コマンドへの引数として扱われます(連載:LinuxコマンドTips 第380回「シェルスクリプトで応用する(参考)」参照)。

 本連載では、まず、getoptを利用したシェルスクリプトを作成し、続いてgetoptなどのコマンドを使わずに、同じようにオプションを処理してみます。

●getoptの使い方

 getoptは、「getopt -o 短いオプションに使用したい文字 -l 長いオプションに使用したい文字列 -- 解析したい文字列」のように使用します。

 例えば、短いオプションとして「-a」と「-b」と「-c」を使いたい場合は、「-o abc」のように指定します。

 引数を取るオプションとしたい場合は、アルファベットの後ろに「:」記号を付けます。「-a」「-b」「-c」のうち、「-a」と「-c」は引数が必須、としたい場合は「-o a:bc:」となります。短いオプションの場合「引数があってもなくてもよい」という設定はできません。

 短いオプションが不要な場合は、「-o ""」とします。また、長いオプションが不要な場合、「-l」の指定は不要です。

 長いオプションに「--aaa」と「--bbb」と「--ccc」を使いたい場合は、「-l aaa,bbb,ccc」のようにします。

 引数を取るオプションとしたい場合は、それぞれの文字列の後ろに「:」記号を付けます。引数があってもなくてもよいという場合は「::」とします。例えば、先ほどの例で「--aaa」は引数があってもなくてもよく、「--ccc」は引数が必須としたい場合は「-l aaa::,bbb,ccc:」とします。

getoptの指定例

getopt -o abc -l aaa,bbb,ccc -- 解析したい文字列

短いオプションとして「-a」「-b」「-c」、長いオプション「--aaa」「--bbb」「--ccc」を使う

getopt -o "" -l aaa,bbb,ccc -- 解析したい文字列

短いオプションなし、長いオプション「--aaa」「--bbb」「--ccc」を使う

getopt -o "abc:" -l aaa::,bbb,ccc: -- 解析したい文字列

短いオプションとして「-a」「-b」「-c」(引数が必須)、長いオプション「--aaa」(任意で引数を取る)「--bbb」「--ccc」(引数が必須)を使う

(詳細は、連載:LinuxコマンドTips 第379回第380回を参照)


 なお、getoptは長いオプションの省略指定にも対応しており、例えば「--file」「--quiet」「--quote」の3つが設定されている場合、「--f」で「--file」、「--qui」で「--quiet」と見なされます()。

【※】getoptには「ハイフン1つでも長いオプションと見なす」というオプション(-a)があります。「getopt -a -o "fi" -l "file"」のように、「-f」と「-i」と「--file」というオプションがあるのにハイフン1つを長いオプション扱いすると、「-fi」が「--file」と見なされる点に注意が必要です。「getopt -a -o "fi" -l "print"」のように、省略指定と短いオプションがかぶらない場合は問題ありませんが、そもそも短いオプションとハイフン1つの長いオプションの混在は避けた方が無難でしょう。



getoptを使ったシェルスクリプトを試す

 それでは、getoptを使ったシェルスクリプトを試してみましょう。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。