複数のgetopts引数の使用を拒否します。

複数のgetopts引数の使用を拒否します。

状況では、複数のgetopts引数を拒否する方法を見つけようとしています。次のようなものがあるとしましょう。

while getopts "a:b:c:def" variable; do
case $variable in
a)a=$OPTARG
b)b=$OPTARG
c)c=$OPTARG
d)MODE=SMTH
e)MODE=SMTH2
f)MODE=SMTH3
esac
done

私が望むのは、複数のMODE arg(def)の使用を拒否し、ユーザーにそれを知らせるメッセージを表示することです。次のようなもの:

./script.sh -a ajhsd -b kjdhas -c daskjdha -d -e -f

複数のMODE arg(def)が使用されていることを確認するためにチェックを実行します。 複数を使用すると、エラーメッセージが表示されます。 ifステートメントをチェックする簡単な入力を試しましたが、悲惨に失敗しました。常に3つの引数をすべて繰り返し、複数の引数チェックを行わずに最後に渡された引数を取得します。少し変です。これは簡単にする必要があります。やらなければなりませんでした...

ベストアンサー1

MODE、および以外の値で初期化する必要があります。次に、MODEが初期値であることを確認します。それ以外の場合は、エラーメッセージを表示して終了します。エラーが発生した後は終了する必要があります。それ以外の場合は、スクリプトは引き続き実行されます。以下のスクリプトの修正バージョンを使用して起動できます。SMTHSMTH2SMTH3

MODE=0
EMSG="More than one of -d, -e, -f has been specified"
while getopts "a:b:c:def" variable; do
case $variable in
a) a=$OPTARG ;;
b) b=$OPTARG ;;
c) c=$OPTARG ;;
d) if [ $MODE = 0 ] ; then MODE=SMTH  ; else  echo $EMSG  ; exit 1 ; fi ;;
e) if [ $MODE = 0 ] ; then MODE=SMTH2 ; else  echo $EMSG  ; exit 1 ; fi ;;
f) if [ $MODE = 0 ] ; then MODE=SMTH3 ; else  echo $EMSG  ; exit 1 ; fi ;;
esac
done

おすすめ記事