POSIXシェルでgetoptsを使用して渡されたオプションを確認するには? (報告、計算、破棄します。)

POSIXシェルでgetoptsを使用して渡されたオプションを確認するには? (報告、計算、破棄します。)

確認パスオプションの使用方法getopts(マンページ)POSIXシェルから? (報告、計算、破棄します。)

私の考えはこんな感じです。私のスクリプトの多くはどんなオプションも使用しません(-h助けるためのものではなく、help直接そのオプションに切り替えます)。したがって、オプション(スイッチ)が複数提供されている場合は、それを計算して報告してから(何もせずに)簡単に削除したいと思います。

、子、および親()0-9はもちろんすべてを含めてみましょう。a-zA-Z


修正する:私のスクリプトの多くは、ファイルを引数として受け入れません。このスクリプトの場合も同様です。


使用法ヘルプは次のとおりです。

usage ()
{
cat << EOF
MPV video player subtitles enable/disable toggling
--------------------------------------------------
on              Enable  subtitles toggling in MPV.
off             Disable subtitles toggling in MPV.
help            Print this help message.
version         Print the script version.
EOF
}

答え1

スクリプトがどのオプションも使用しませんが、どのオプションが(間違って)渡されたかを確認し、エラーを直接処理したい場合は、getoptsオプション仕様:$OPTARGgetoptsユーティリティのPOSIX仕様(強調):

オプション文字が含まれていない場合オプションの文字列オプション文字が予想される場所でオペランドが見つかった場合は、nameで指定されたシェル変数を<疑問符>(?)文字に設定する必要があります。この場合、最初の文字の場合オプションの文字列<コロン>(:)の場合、シェル変数はOPTARG見つかったオプション文字に設定する必要がありますが、出力は標準エラーに書き込まれません。;そうでない場合は、シェル変数の設定を解除し、OPTARG診断メッセージを標準エラーに書き込む必要があります。この状況は、呼び出し側アプリケーションにパラメーターを提供する方法で検出されたエラーと見なす必要がありますが、getopts処理中にエラーにしてはいけません。

したがって、次のように書くことができます。

optnum=0; while getopts : opt; do
    printf >&2 '%s\n' "Illegal option -$OPTARG"
    optnum=$(( optnum + 1 ))
done

if [ "$optnum" -gt 0 ]; then
    printf >&2 '%s\n' "Some ($optnum) option switches were passed to the script, but none expected!"
fi
shift "$(( OPTIND - 1 ))"
if [ "$#" -gt 0 ]; then
  echo "Non-option argument${2+s}:"
  printf ' - %s\n' "$@"
fi

例:

$ ./that-script -asd --output=asd -- rest
Illegal option -a
Illegal option -s
Illegal option -d
Illegal option --
Illegal option -o
Illegal option -u
Illegal option -t
Illegal option -p
Illegal option -u
Illegal option -t
Illegal option -=
Illegal option -a
Illegal option -s
Illegal option -d
Some (14) option switches were passed to the script, but none expected!
Non-option argument:
 - rest

ただし、オプションのない(しかしまだ処理中の)スクリプトは--通常次のとおりです。

PROGNAME=$0
usage() {
  printf >&2 '%s\n' "Usage: $PROGNAME [<file> [<file>...]]"
  exit 1
}
getopts '' opt && usage
shift "$(( OPTIND - 1))"

for file do
  printf 'Got "%s"\n' "$file"
done

そして、最初のエラーで失敗した終了状態で終了するのが最も賢明な方法です。

$ ./that-script -weirdly-named-.txt
./that-script: illegal option -- w
Usage: ./that-script [<file> [<file>...]]
$ ./that-script -- -weirdly-named-.txt
Got "-weirdly-named-.txt"

getoptsプレフィックスを省略して、誤ったオプション自体に関するエラーメッセージを印刷します:

もちろん、オプションが処理された後、必要に応じて残りのパラメータを検証できます。たとえば、スクリプトがオプションではなく引数も受け入れる場合は、次のように呼び出した後shift

if [ "$#" -ne 0 ]; then
  echo>&2 'This script does not accept any argument.'
  usage
fi

実際にはorとしか呼び出せませthat-scriptthat-script --getoptsオプション、オプション区切り記号、非オプションパラメータなど、すべてのパラメータをスキップまたは拒否することもできます。

またはUsage: cmd [<type> <length> <value> [<type> <length> <value>]...]:

if [ "$(( $# % 3 ))" -ne 0 ]; then
  echo>&2 'The number of arguments must be a multiple of 3'
  usage
fi

など。

関連情報