getopts

getopts
開発者さまざまなオープンソースおよび商用開発者
初回リリース1986年; 39年前 (1986)
オペレーティング·システムUnixUnixライクIBM i
タイプ指示

getoptsは、コマンドライン引数を解析するためのUnixシェル組み込み コマンドです。getoptのCインターフェースに基づいて、POSIXユーティリティ構文ガイドラインに準拠したコマンドライン引数を処理するように設計されています

の前身は、Unix System Laboratoriesによるgetopts外部プログラムでしたgetopt

歴史

オリジナルにgetoptはいくつかの問題がありました。引数内の空白やシェルのメタ文字を処理できず、エラーメッセージの出力を無効にする機能もありませんでした。[1]

getoptsgetoptsは1986年にUnix SVR3に同梱されたBourneシェルで初めて導入されました。シェル独自の変数OPTINDOPTARGを使用して現在の位置と引数の位置を追跡し、オプション名をシェル変数に返します。[2] Bourneシェルの以前のバージョンにはgetopts はありませんでした。

1995年に、はSingle UNIX Specification version 1 / X/Open Portability Guidelines Issue 4getoptsに含まれました。 [3]その結果、はBourneシェルKornShellAlmquistシェルBashZshなどのシェルで利用できるようになりました[4]getopts

getoptsコマンドIBM iオペレーティングシステムにも移植されています。 [5]

の現代的な使用法は、主にutil-linuxgetoptの実装の改良により部分的に復活しました。BSD をベースにしたこのバージョンは、古い に関する2つの不満点を修正しただけでなく、 にはないGNUスタイルの長いオプションとオプションの省略可能な引数を解析する機能も導入しました[6]しかし、様々なBSDディストリビューションは古い実装に固執しました。[1]getoptgetoptgetopts

使用法

getopt と getopts の使用法の概要は、C の兄弟と似ています。

getopt optstring  [パラメータ]
getopts optstring  varname  [パラメータ]
  • optstring部分C の兄弟部分と同じ形式になります。
  • パラメータ部には、getopt に解析させたいパラメータをそのまま入力します。共通の値はすべてのパラメータ、つまり POSIX シェルでは「$@」です。
    • この値はgetoptsに存在しますが、シェルのパラメータにアクセスするだけなので、ほとんど使用されません。ただし、パーサーをリセットする際には便利です。
  • getopts のvarname部分は解析されたオプションを格納するシェル変数の名前を指定します。

ただし、コマンドの使用方法は大きく異なります。

  • getoptは、単に「正規化された」引数を表す、空白で区切られたトークンを含むフラットな文字列を返します。その後、whileループを使用してネイティブに解析します。[1]
  • getoptsはC言語のgetoptと同様に繰り返し呼び出されるように設計されています。引数の末尾に達すると、1(シェル偽)を返します。[3]

機能強化

さまざまなgetopts

2004年春(Solaris 10ベータ開発)に、 getopt()のlibc実装が拡張され、長いオプションがサポートされました。その結果、この新機能はBourne Shellの組み込みコマンドでも利用できるようになりました。これは、長いエイリアスを指定するoptstring内の括弧で囲まれたサフィックスによって実行されます。 [7]getopts

KornShellZshはどちらも長い引数のための拡張機能を持っています。前者はSolarisと同じように定義されていますが[8] 、後者は別のzparseoptsコマンドで実装されています。[9]

KornShellはさらに、の代わりにで始まるオプションに対してoptstring拡張を実装しています。[8]+-

Linuxのgetopt

の代替として、外部コマンドライン プログラムgetoptsである の Linux 拡張バージョンがあります。getopt

Linux拡張版の は、getoptの安全性にgetopts加え、より高度な機能を備えています。長いオプション名(例:--help)をサポートし、オプションはすべてのオペランドの前に記述する必要はありません(例: はcommand operand1 operand2 -a operand3 -bLinux拡張版の では許可されていますgetoptが、 では機能しません)。また、シェル( tcshやPOSIX shgetoptsなど)のメタ文字のエスケープや、省略可能な引数もサポートしています。 [6]

比較

プログラム
特徴
POSIX getoptsSolaris/ksh getoptsUnix/BSD getoptLinux の getopt
簡単に解析できるようにオプションを分割しますはいはいはいはい
エラーメッセージを抑制できますはいはいいいえはい
空白とメタ文字を安全に使用はいはいいいえはい
オペランドをオプションと混在させることができますいいえはいいいえはい
長いオプションをサポートエミュレーションはいいいえはい
オプション引数エラー処理エラー処理いいえはい

3 つのオプションと 0 個の追加引数を取る、bash で Wikipedia ダウンローダーを構築するとします。

wpdown -a記事名-l [言語] -v

可能な場合は、次の長い引数を許可します。

-a --記事-l --言語, --lang-v --詳細表示

わかりやすくするためにヘルプテキストは記載しておらず、任意のウェブページをダウンロードするプログラムが存在するものと仮定しています。また、すべてのプログラムは以下の形式です。

#!/bin/bash冗長= 0記事= lang = ja# [ここに例]if (( verbose > 2 )) ; then printf '%s\n' 'オプション以外の引数:' printf '%q ' " ${残り[@]] } " fi          if (( verbose > 1 )) ; then printf '%s をダウンロードしています:%s\n' " $lang " " $article " fi        if [[ ! $article ]] ; then printf '%s\n' "記事がありません!" > & 2 exit 1 fi           save_webpage "https:// ${ lang } .wikipedia.org/wiki/ ${ article } " 

古いgetoptの使用

古い getopt はオプションの引数をサポートしていません:

# すべてを解析します。失敗した場合は終了します。args = ` getopt 'a:l:v' $* ` || exit # これでサニタイズされた引数ができました。元の引数をそれに置き換えます。set -- $args      while  true ; do case $1 in ( -v ) (( verbose++ )) ; shift ;; ( -a ) article = $2 ; shift 2 ;; ( -l ) lang = $2 ; shift 2 ;; ( -- ) shift ; break ;; ( * ) exit 1 ;; # error esac done                       残り=( " $@ " )

このスクリプトは、スペースやシェルのメタ文字 (? や * など) が含まれる記事タイトルでも実行されません。

getoptsの使用

Getopts はスクリプトに C インターフェイスの外観と操作性を与えますが、POSIX ではオプションの引数はまだ存在しません。

#!/bin/sh while getopts ':a:l:v' opt ; do case $opt in ( v ) (( verbose++ )) ;; ( a ) article = $OPTARG ;; ( l ) lang = $OPTARG ;; ( : ) # "optional arguments" (オプション引数の処理がありません) case $OPTARG in ( a ) exit 1 ;; # 構文上はエラーです( l ) : ;; # 許容されますが何もしませんesac ;; esac done                           shift " $(( OPTIND - 1 )) " # 残りは "$@"   

シェルオプションを直接操作しなくなったため、ループ内でオプションをシフトする必要はなくなりました。ただし、解析されたオプションを削除し、残りの引数を残すためにスライス操作が必要です。

フラグの長いオプションのサポートは、オプションの--fast引数として扱うことで簡単にエミュレートできます。つまり、が optstring に追加され、の case として追加され、その中で がと一致するかどうかが評価されます。引数付きの長いオプションのサポートはより面倒ですが、オプションと引数が=で区切られていれば可能です[10]fast--:-optOPTARGfast

Linuxのgetoptの使用

Linuxのgetoptは出力をエスケープするため、シェルに解釈させるには「eval」コマンドが必要です。残りは変更ありません。

#!/bin/bash# 引数境界情報を保持するために、"${*}" の代わりに "${@}" を使用しますargs = $( getopt  --options 'a:l::v' --longoptions 'article:,lang::,language::,verbose' -- " ${ @ } " ) || exit eval "set -- ${ args } "        while  true ; do case " ${ 1 } " in ( -v | --verbose ) (( verbose++ )) shift ;; ( -a | --article ) article = ${ 2 } shift 2 ;; ( -l | --lang | --language ) # handle オプション: getopt はこれを空の文字列に正規化しますif [[ -n ${ 2 } ]] ; then lang = ${ 2 } fi shift 2 ;; ( -- ) shift break ;; ( * ) exit 1 # error ;; esac done                                             残りの引数=( " ${ @ } " )

参照

参考文献

  1. ^ abc getopt(1) –  FreeBSD一般コマンドマニュアル
  2. ^ Mascheck, Sven. 「The Traditional Bourne Shell Family」 . 2010年12月1日閲覧
  3. ^ ab "getopts". The Open Group (POSIX 2018) .
  4. ^ 「Bash リファレンスマニュアル」。
  5. ^ IBM . 「IBM System i バージョン 7.2 プログラミング Qshell」(PDF) . IBM . 2020年9月5日閲覧。
  6. ^ ab getopt(1) –  ManKier.com のLinux一般コマンドマニュアル
  7. ^ "getopt(3)". Oracle Solaris 11.2 情報ライブラリ.
  8. ^ ab 「ksh getopts -- シェルスクリプトのコマンドラインからオプションを解析する」。www.mkssoftware.com
  9. ^ zshmodules(1)  –  ManKier.com のLinux一般コマンドマニュアル
  10. ^ 「Bash のシンプルな CLI パーサー」。
Retrieved from "https://en.wikipedia.org/w/index.php?title=Getopts&oldid=1225331518"