2012-07-01 7 views
27

getoptsを使用して複数のオプションを同時に処理できますか?たとえば、myscript -iRまたはmyscript -irvです。bash getoptsに複数の必須オプションを指定

また、条件スクリプトに基づいて必須オプションが必要な状況があります。たとえば、スクリプトへの引数がディレクトリの場合、他のオプションと一緒に-Rまたは-rオプションを指定する必要があります(myscript -iR mydirまたはmyscript -ir mydirまたはmyscript -i -r mydirまたはmyscript -i -R mydir)、ファイルの場合にのみ-iで十分です(myscript -i myfile)。

私は検索しようとしましたが、回答がありませんでした。

答えて

73

あなたが指定したオプションを連結し、getoptsでそれらを区切ります。 caseステートメントでは、各オプションを個別に処理します。

オプションが表示されているときにフラグを設定し、getoptsループの完了後に必須の「オプション」(!)が存在することを確認することができます。ここ

は一例であり:

#!/bin/bash 
rflag=false 
small_r=false 
big_r=false 

usage() { echo "How to use"; } 

options=':ij:rRvh' 
while getopts $options option 
do 
    case $option in 
     i ) i_func;; 
     j ) j_arg=$OPTARG;; 
     r ) rflag=true; small_r=true;; 
     R ) rflag=true; big_r=true;; 
     v ) v_func; other_func;; 
     h ) usage; exit;; 
     \?) echo "Unknown option: -$OPTARG" >&2; exit 1;; 
     : ) echo "Missing option argument for -$OPTARG" >&2; exit 1;; 
     * ) echo "Unimplemented option: -$OPTARG" >&2; exit 1;; 
    esac 
done 

shift $(($OPTIND - 1)) 

if ! $rflag && [[ -d $1 ]] 
then 
    echo "-r or -R must be included when a directory is specified" >&2 
    exit 1 
fi 

これはgetopts関数の完全なリファレンス実装を表すが、より大きなスクリプトの唯一のスケッチです。

+1

デニスに感謝します。私はあなたが提案したようにフラグを使用しました。私は、オプションを連結して変数に格納し、後で提供されるオプションに基づいて処理を行うことで、ロジックを単純化しようとしました。 –

+0

@RameshSamane:どうぞよろしくお願いいたします。私の答えが役に立ったら、それを合格とマークしてください。 –

+0

私はすでにそれを試しましたが、「投票で15の評判が必要です」というメッセージを受け取りました。しかし、スレッドの最下部にある「はい」をクリックして、「この記事は役に立ちましたか? 「あなたのフィードバックをありがとう」というメッセージを受け取りました。 –

関連する問題