はてな
コマンドラインオプションとは何でしょうか?
もっと詳しく
bashでは組み込みコマンドのgetoptsを使うと、楽にコマンドラインオプションが扱えます。
シェルスクリプトでコマンドラインオプションを使おう
getoptsの基本的な使い方
getoptsの基本的な使い方は、以下のようになります。
オプション文字は、-(ハイフン)のあとにつける文字を定義します。
変数名で定義した変数には、コマンドラインオプションで渡されたオプション文字が入ります。
getopts オプション文字 変数名
注意ポイント
オプション文字は、:(コロン)と?(クエスチョンマーク)は使えません。
getoptsを使ったもっとも簡単なシェルスクリプトは、以下のようになります。
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash getopts a opt if [[ "$opt" == a ]] then echo "OK" else echo "NG" fi |
-aをつけて実行すると「OK」が表示され、-a以外をつけて実行するとエラーメッセージと「NG」が表示されます。
実行例
$ ./getopts1.sh -a
OK
$ ./getopts1.sh -b
./getopts1.sh: illegal option -- b
NG
エラーメッセージを表示しない
上記の例では、オプション文字にa以外を使うと、エラーメッセージが表示されます。
エラーメッセージを表示したくない場合は、オプション文字の先頭に:(コロン)をつけます。
getopts :オプション文字 変数名
エラーメッセージを表示させないシェルスクリプトは、以下のようになります。
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash getopts :a opt if [[ "$opt" == a ]] then echo "OK" else echo "NG" fi |
-a以外をつけて実行しても、エラーメッセージは表示されません。
実行例
$ ./getopts2.sh -b
NG
コマンドラインオプションに引数を渡す
コマンドラインオプションに引数を渡す場合は、オプション文字の後ろに:(コロン)をつけます。
渡された引数は、組み込み変数OPTARGに入ります。
getopts オプション文字: 変数名
コマンドラインオプションに引数を渡したシェルスクリプトは、以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash getopts a: opt if [[ "$opt" == a ]] then echo "OK" echo "$OPTARG" else echo "NG" fi |
組み込み変数OPTARGに、-aの引数が入っています。
実行例
$ ./getopts3.sh -a AAA
OK
AAA
オプション文字を複数使う
オプション文字は、複数定義することができます。
区切り文字や空白などは入れず、オプション文字を連続して記述します。
getopts オプション文字1オプション文字2... 変数名
複数のオプション文字を定義した場合は、while文を使って渡されたオプション文字を順番に参照します。
定義されたオプション文字以外が渡された場合は、変数optに?(クエスチョンマーク)が入ります。
?は特殊文字(1文字のワイルドカード)なので、?の前に\(バックスラッシュ)を入れてエスケープします。
こうすることで、case文は「?」という通常の文字として認識するようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/bin/bash while getopts abc opt do case "$opt" in a) echo "オプションは$optです" ;; b) echo "オプションは$optです" ;; c) echo "オプションは$optです" ;; \?) echo "オプションが違います" ;; esac done |
オプション文字が複数ある場合は、-abcのようにまとめてオプション文字を書くことができます。
実行例
$ ./getopts4.sh -b
オプションはbです
$ ./getopts4.sh -abc
オプションはaです
オプションはbです
オプションはcです
$ ./getopts4.sh -d
./getopts4.sh: illegal option -- d
オプションが違います
getoptsの一般的な使い方
最後に、実際に良く使われるgetoptsの使い方です。処理の条件は以下の通りです。
処理条件
- オプション文字の先頭に:(コロン)をつけて、エラーメッセージを表示させない
- オプション文字として、a、b、cを使う
- コマンドラインオプションのaとbは引数を使う
上記の条件にしたがったシェルスクリプトは、以下のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#!/bin/bash while getopts :a:b:c opt do case "$opt" in a) echo "オプションは$optです" echo "$OPTARG" ;; b) echo "オプションは$optです" echo "$OPTARG" ;; c) echo "オプションは$optです" ;; \?) echo "オプションが違います" ;; esec done |
オプション文字にdは定義されていないので、?(クエスチョンマーク)の条件に入ります。
実行例
$ ./getopts5.sh -a AAA -b BBB -cd
オプションはaです
AAA
オプションはbです
BBB
オプションはcです
オプションが違います