getoptsで始まり、次のスクリプトがあります。
USAGE() { echo -e "Usage: bash $0 [-w <in-dir>] [-o <out-dir>] [-c <template1>] [-t <template2>] \n" 1>&2; exit 1; }
if (($# == 0))
then
USAGE
fi
while getopts ":w:o:c:t:h" opt
do
case $opt in
w ) BIGWIGS=$OPTARG
;;
o ) OUTDIR=$OPTARG
;;
c ) CONTAINER=$OPTARG
;;
t ) TRACK=$OPTARG
;;
h ) USAGE
;;
\? ) echo "Invalid option: -$OPTARG exiting" >&2
exit
;;
: ) echo "Option -$OPTARG requires an argument" >&2
exit
;;
esac
done
more commands etc
echo $OUTDIR
echo $CONTAINER
私はこのスクリプトについていくつかのテストをしていますが、いくつかの手順では-cパラメータ[-c]を使用する必要はありませんし、使用したくありません。つまり、$ CONTAINER変数をまったく含まないスクリプトの別の特定の部分をテストしようとします。だから私は$ CONTAINERのすべてのコマンドの前に#を追加していくつかのテストを試してみました。
$CONTAINER を使用せずにスクリプトをテストする場合は、次のように入力します。
bash script.bash -w mydir -o myoutdir -t mywantedtemplate
しかし、getoptsコマンドが与えられたときに警告が表示されないかどうか疑問に思います。つまり、-cパラメータが必要であるという警告が表示されないのはなぜですか?可能ですか?次のように入力すると警告が表示されます。
bash script.bash -w mydir -o myoutdir -t mywantedtemplate -c
修正する
いくつかのテストを経た後、私は次のように考えました。
- 明示的に「-c」を書かないと、getoptsは「質問」せずにエラーを表示します(スクリプトがそれを使用して何かをしない限り - つまり、各コマンドの前に#を入れていない場合)。この主張)
- 「-c」のみを入力し、何も入力しないとエラーが発生します。
そうですか?おそらく私がしたことは「悪い習慣」だったので避けなければなりません。テストするときは、getoptsコマンドからc:を完全に削除する必要がありました。
私が尋ねるものは次のとおりです。 getoptsにパラメータ(私のスクリプトの「while」行)について知らせるとき、私たちは次のように言います。これは予想されるオプションであり、「:」の後に続くオプションにはパラメータが必要です。それらを 。しかし、それらは与えられる必要はありません。つまり、引数を含むcオプションを期待できますが、cオプションがまったく指定されていなくてもエラーは発生しません。
ベストアンサー1
ユーティリティgetopts
はわからない必須オプション、どのオプションが許可されるか(そしてどのオプションがオプション引数を取るべきか)についてのみ説明します。必須オプションを適用するには、オプション解析ループの内側または後で独自のテストを実行する必要があります。
getopts
一部のオプションが競合したり、一部のオプションに異なるオプションが必要であるなど、オプションがより複雑な関係を持つ可能性があるため、ユーティリティはこれを実行しません。これは、スクリプト作成者が自分のロジックに従ってクリーンアップすることを残します。