getoptコマンドはCのgetopt関数のような機能を持つオプション解析コマンドになります。
この記事では、util-linux版のgetoptコマンドについて紹介します。このgetoptの特徴としてスペース等の文字も引数に利用できます。
bash組み込みコマンドのgetoptsコマンドとの違いとしてロングオプションの設定も行うことができます。
getoptコマンドの構文
getoptコマンドの構文は
1 2 3 |
getopt [options] [--] optstring parameters getopt [options] -o|--options optstring [options] [--] parameters |
のどちらかを基本的に利用します。
1 |
getopt optstring parameters |
の構文は互換モードで出力の引数に引用符がつかないモードになります。
この場合の出力に対して、'eval set --'で位置パラメータを設定し直すときに問題が起きる場合があります。
getoptコマンドの利用
getoptコマンドは、
-oオプションでショートオプションについてのオプション文字列を指定できます。指定するオプションの後に':'付けることで引数を要求します。また、'::'をつけることで引数をオプションにすることができます(引数の有無は空文字列かそれ以外かで判断となります)。
-lオプションでロングオプションについてのオプション文字列を指定できます。オプション文字列はカンマ区切りで指定します。
-nオプションでプログラム名を指定することで解析エラー時にそのプログラムの名前を表示できます。
getoptコマンドの出力結果は標準出力になります。
getopt_demo1.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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#!/bin/bash short_opt_str='ab:c' long_opt_str='aopt,bopt:,copt' progname='getopt_memo1.sh' TEMP=$(getopt -o "$short_opt_str" -l "$long_opt_str" -n "$progname" -- "$@") if [ $? -ne 0 ]; then echo 'Error...' >&2 exit 1 fi eval set -- "$TEMP" unset TEMP while true; do case "$1" in '-a'|'--aopt') echo 'a option demo' shift ;; '-b'|'--bopt') echo 'b option demo' echo "b option args: $2" shift 2 ;; '-c'|'--copt') echo 'c option demo' shift ;; '--') shift break ;; '-a'|'--aopt') echo 'Internal error' >&2 exit 1 ;; esac done while [ $# -gt 0 ]; do echo "PROGRAM_ARG: $1" shift done |
実行例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ ./getopt_demo1.sh -ac -b boptarg arg1 arg2 a option demo c option demo b option demo b option args: boptarg PROGRAM_ARG: arg1 PROGRAM_ARG: arg2 $ $ ./getopt_demo1.sh --aopt --bopt boptarg arg1 arg2 a option demo b option demo b option args: boptarg PROGRAM_ARG: arg1 PROGRAM_ARG: arg2 $ $ ./getopt_demo1.sh -d getopt_memo1.sh: 無効なオプション -- 'd' Error... |
setコマンドで位置パラメータを設定し直すことができます。
evalコマンドは様々な問題を起こすコマンドではありますが、機能としては単純で指定した文字列をコマンドとして実行できます。
util-linux版だとスクリプトの例が/usr/share/doc/util-linux/examples/にあります。