確認パスオプションの使用方法getopts
(マンページ)POSIXシェルから? (報告、計算、破棄します。)
私の考えはこんな感じです。私のスクリプトの多くはどんなオプションも使用しません(-h
助けるためのものではなく、help
直接そのオプションに切り替えます)。したがって、オプション(スイッチ)が複数提供されている場合は、それを計算して報告してから(何もせずに)簡単に削除したいと思います。
、子、および親()0-9
はもちろんすべてを含めてみましょう。a-z
A-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
オプション仕様:
に$OPTARG
。getopts
ユーティリティの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-script
んthat-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
など。