getoptsコマンドの構文は
1 |
getopts オプション文字列 変数 |
になります。
以下はgetoptsコマンドを利用したオプション解析の例になります。
getopts_analyze.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#!/bin/bash function main() { while getopts "abc" opt; do case "$opt" in a) echo "option a demo" ;; b) echo "option b demo" ;; c) echo "option c demo" ;; \?) exit 1 ;; esac done shift $((OPTIND - 1)) while [ $# -gt 0 ]; do echo "PROGRAM_ARG: $1" shift done } main "$@" |
getoptsコマンドを実行した後は変数OPTINDを利用して、引数からオプションの引数を一気に飛ばすことができます。
想定外のオプションは'?'の文字が入ります。'?'の文字はマッチングで任意の一文字に該当するのでエスケープ処理を行います。
このプログラムの実行結果は以下のようになります。
実行結果
1 2 3 4 5 6 7 |
$ bash getopts_analyze.sh -abc aa bb cc option a demo option b demo option c demo PROGRAM_ARG: aa PROGRAM_ARG: bb PROGRAM_ARG: cc |
引数を持つオプション
getoptsコマンドではオプションに一つ引数をつけることができます。その場合は引数を付けたいオプションの後に':'を追加します。
オプションの引数は変数OPTARGにセットされます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
#!/bin/bash function main() { local aoptfl=false local boptfl=false local coptfl=false local aoptdata='' local coptdata='' opt_parse "$@" opt_process prog_process "$@" } function opt_parse() { local options="a:bc:" while getopts "$options" opt; do case "$opt" in a) aoptfl=true aoptdata="$OPTARG" ;; b) boptfl=true ;; c) coptfl=true coptdata="$OPTARG" ;; \?) exit 1 ;; esac done } function opt_process() { if $aoptfl; then echo "option a demo" echo "option a data: $aoptdata" fi if $boptfl; then echo "option b demo" fi if $coptfl; then echo "option c demo" echo "option c data: $coptdata" fi } function prog_process() { shift $((OPTIND - 1)) while [ $# -gt 0 ]; do echo "PROGRAM_ARG: $1" shift done } main "$@" |
このプログラムの実行結果は以下のようになります。
実行結果
1 2 3 4 5 6 7 8 9 |
$ bash getopts_analyze2.sh -a adata -bc 'cdata' aa bb cc option a demo option a data: adata option b demo option c demo option c data: cdata PROGRAM_ARG: aa PROGRAM_ARG: bb PROGRAM_ARG: cc |