getoptsはどのような順序でコマンドライン引数を読みますか?

getoptsはどのような順序でコマンドライン引数を読みますか?

Bashのマニュアルによると

getopts optstring name [args]

オプションの終わりに達すると終了し、getopts0より大きい値を返します。OPTINDオプションではなく、最初の引数のインデックスに設定し、にname設定します?

それはどういう意味ですか?

  • getoptsオプションとオプション引数だけを読み、オプションもオプション引数でもない引数は読みませんか?

  • getoptsオプションもオプション引数でもない一部の引数の後に、コマンドラインでいくつかのオプションを指定する操作を処理できませんか?つまり、getoptsすべてのオプションとオプション引数の後にオプションでもなく、オプション引数でもない引数を指定する必要がありますか?

ありがとうございます。

答え1

はい、getoptsPOSIXの方法でオプションを解析するツールです(bashGNUシェルでも利用可能)。

存在する:

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-linuxbusybox実装を使用できます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'

関連情報