長い(gnuスタイル)オプションをサポートするbashスクリプト

些細なタスクが一目で登場しました。起動時にさまざまなオプションを使用してスクリプトを記述することです。 nameとdirの2つのオプションのみを処理する必要があるとします。 そして、私たちのオプションが短いのであれば、タスクは本当に簡単です。 しかし、長いオプションを使用したいという強い欲求がある場合、書き込みはなくなります:getopts(最初に使用される予定でした)は、bashではまったく良くありません。



kshではすべてが大丈夫です:

#!/bin/ksh while getopts "f(file):s(server):" flag do echo "$flag" $OPTIND $OPTARG done
      
      





しかし、bashがあるため、残念ながらため息をつき、この状況から脱出しようとします。

Vriantの解析自体は魅力的ですが、つまらなくて面白くありません。エラー、例外、その他多くのことを処理することを考える必要があるたびに。 はい、そして、そのようなスクリプトを書くとき、毎回車輪を再発明したくありません。

 #!/bin/bash while true; do case "$1" in -n | --name ) echo NAME="$2"; shift 2;; -d | --dir ) echo DIR="$2"; shift 2;; esac done
      
      





短い名前でgetoptsを使用して、長い名前をサポートすることができます。

 #!/bin/bash while getopts ":n:d:-:" OPTION; do case "$OPTION" in -) case "$OPTARG" in name) echo LONG_NAME="${!OPTIND}";; dir) echo LONG_DIR="${!OPTIND}" ;; esac;; n) echo SHORT_NAME="$OPTARG" ;; d) echo SHORT_DIR="$OPTARG" ;; esac done
      
      





しかし、このようなソリューションを機能させるために、言語は向きを変えません。同時にサポートされるのは1つの長いオプション(パラメーターで指定された最初のオプション)のみで、2番目のオプションは無視されます。



bashではgetopts_longがまだ実装されていないことを不満に思っていますが、Googleはこれを個別に行うことを提案しています。getopts_long関数をダウンロードしてスクリプトに含めます。

 #!/bin/bash . getopts_long while getopts_long :d:n::vh opt \ name required_argument \ dir required_argument \ help 0 "" "$@" do case "$opt" in n|name) echo NAME="$OPTLARG";; d|dir) echo DIR="$OPTLARG";; help 0 "" "$@" esac done
      
      





それは幸せそうに思えますが、さらにエレガントな解決策がありました。解析オプションに加えて値をチェックできる、より高度なshflagsライブラリです。 文字列、論理変数、整数、非整数は区別されます(シェルには非整数の概念がないため、本質的には文字列ですが、形式の正確さはチェックされます。これは、DEFINE_string | _boolean | _float | _integerおよびオプションの長い名前に応じてオプションの変数を独立して呼び出し、さまざまなシェル(sh、bash、dash、ksh、zsh)の束もサポートします。美しさのみ。 :

 #!/bin/bash . ./shflags DEFINE_string 'name' 'world' 'comment for name' 'n' DEFINE_string 'dir' 'dir' 'comment for dir' 'd' FLAGS "$@" || exit 1 eval set -- "${FLAGS_ARGV}" echo "Name is ${FLAGS_name} and dir is ${FLAGS_dir}"
      
      





ただし、このソリューションには軟膏もあります。ライブラリはオプションの解析にgetoptを使用し、インターネットで言われているように、曲げられていないgetoptは長いオプションをサポートしていません。 そのため、互換性の問題がある可能性があります。



All Articles