| 開発者 | さまざまなオープンソースおよび商用開発者 |
|---|---|
| 初回リリース | 1986年 |
| オペレーティング·システム | Unix、Unix ライク、IBM i |
| タイプ | 指示 |
getoptsは、コマンドライン引数を解析するための組み込み Unix シェルコマンドです。 getoptの C インターフェイスに基づいて、POSIX ユーティリティ構文ガイドラインに準拠したコマンドライン引数を処理するように設計されています。
の前身は、Unix System Laboratoriesによるgetopts外部プログラムでした。
getopt
歴史
オリジナルにgetoptはいくつかの問題がありました。引数内の空白やシェルのメタ文字を処理できず、エラーメッセージの出力を無効にする機能もありませんでした。[1]
getopts1986年にUnix SVR3に同梱されたBourneシェルで初めて導入されました。シェル独自の変数OPTINDとOPTARGを使用して現在の位置と引数の位置を追跡し、オプション名をシェル変数に返します。[2] Bourneシェルの以前のバージョンにはgetopts はありませんでした。
1995年に、はSingle UNIX仕様バージョン1 / X/Open移植性ガイドライン第4版getoptsに含まれました。 [3]その結果、はBourneシェル、KornShell、Almquistシェル、Bash、Zshなどのシェルで利用できるようになりました。[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
KornShellとZshはどちらも長い引数のための拡張機能を持っています。前者は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]
比較
例
3 つのオプションと 0 個の追加引数を取る、bash で Wikipedia ダウンローダーを構築しているとします。
wpdown -a記事名-l [言語] -v
可能な場合は、次の長い引数を許可します。
-a --記事 -l --言語、--言語 -v --詳細表示
わかりやすくするために、ヘルプ テキストは含まれておらず、任意の Web ページをダウンロードするプログラムがあると想定しています。また、すべてのプログラムは次の形式です。
#!/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 に追加され、のケースとして追加され、その中でが と一致するかどうかが評価されます。引数付きの長いオプションをサポートするのは面倒ですが、オプションと引数が=で区切られている場合は可能です。[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
残りの引数=( " ${ @ } " )
参照
参考文献
- ^ abc – FreeBSD一般コマンドマニュアル
- ^ Mascheck, Sven. 「The Traditional Bourne Shell Family」. 2010 年 12 月 1 日閲覧。
- ^ ab "getopts". The Open Group (POSIX 2018) .
- ^ 「Bashリファレンスマニュアル」。
- ^ IBM . 「IBM System i バージョン 7.2 プログラミング Qshell」(PDF) . IBM . 2020 年 9 月 5 日閲覧。
- ^ ab – Linux一般コマンドマニュアル
- ^ "getopt(3)"。Oracle Solaris 11.2情報ライブラリ。
- ^ ab "ksh getopts -- シェル スクリプトのコマンド ラインからオプションを解析します" 。www.mkssoftware.com。
- ^ – Linux一般コマンドマニュアル
- ^ 「Bash のシンプルな CLI パーサー」。
外部リンク
- : コマンドライン引数の処理 – シェルおよびユーティリティ リファレンス、The Single UNIX 仕様、バージョン 4、The Open Group
