Bashのマニュアルによると
getopts optstring name [args]
オプションの終わりに達すると終了し、
getopts
0より大きい値を返します。OPTIND
オプションではなく、最初の引数のインデックスに設定し、にname
設定します?
。
それはどういう意味ですか?
getopts
オプションとオプション引数だけを読み、オプションもオプション引数でもない引数は読みませんか?getopts
オプションもオプション引数でもない一部の引数の後に、コマンドラインでいくつかのオプションを指定する操作を処理できませんか?つまり、getopts
すべてのオプションとオプション引数の後にオプションでもなく、オプション引数でもない引数を指定する必要がありますか?
ありがとうございます。
答え1
はい、getopts
POSIXの方法でオプションを解析するツールです(bash
GNUシェルでも利用可能)。
存在する:
cmd -abc -dxx -e yy arg -f -g
(optspecは:abcd:e:fg
)
-f
-g
一般的なパラメータです。getopts
それだけですarg
。
一般的に言えば、
while getopts...
case...esac
done
shift "$((OPTIND - 1))"
echo Remaining arguments:
[ "$#" -eq 0 ] || printf ' - %s\n' "$@"
オプション以外の引数の後にオプションが考慮されるGNU方式でオプションを処理したい場合(--
環境にない場合、またはPOSIXLY_CORRECTがある場合を除く)の代わりに、またはutil-linux
busybox実装を使用できますgetopt
(他のAPIを使用)。このオプションは長いオプションもサポートしています。しかし、Linuxの外では移植性はありません。
次の操作を行います。
parsed_opts=$(getopt -o abcd:e:fg -l long -- "$@") || usage
eval "set -- $parsed_opts"
for o do
case $o in
(-[abcfg]) echo "no-arg option: $o"; shift;;
(--long) echo "long option"; shift;;
(-[de]) printf '%s\n' "option $o with arg $2"; shift 2;;
(--) shift; break;;
(*) echo "never reached";;
esac
done
echo Remaining args:
[ "$#" -eq 0 ] || printf ' - %s\n' "$@"
このオプションでは、対応するパラメータはやや並べ替えられ、そのパラメータは「残りのパラメータ」から削除されます。
$ busybox getopt -o abcd:e:fg -l long -- -a foo bar -e x baz --l
-a -e 'x' --long -- 'foo' 'bar' 'baz'