getoptsを使用して非オプション引数の後にオプションを解析する


10

次のようなbashスクリプトがファイルにありnepleaks_upd.sh、実行したい./nepleaks_upd.sh bootstrap --branch off。うまくいきませんでしたが--branch、動作します./nepleaks_upd.sh bootstrap -b off

usage() { echo "Usage: $0 [prepare | up | down]  [-b <on/off>]" 1>&2; exit 1; }                                                                                                 

case "$1" in                                                                                           
               bootstrap)                                                                                  
                  while getopts ":b:" o; do                                                            
                   case "${o}" in                                                                      
                    b)                                                                                 
                        b=${OPTARG}                                                                    
                        if [ ${b} == "off" ]; then                                                      
                               echo "git clone https://github.com/iPrayag/dotfiles.git"  
                               ## logic                                                      
                        fi                                                                             
                        ;;                                                                             
                    *)                                                                                 
                        echo ${o}                                                                      
                        usage                                                                          
                        ;;                                                                             
                   esac                                                                                
                  done                                                                                 
                  shift $((OPTIND-1))                                                                  
                  echo "option1 = ${o}" 
                  echo "option2 = ${b}"                                                                      
                  if [ -z "${b}" ]; then                                                               
                         usage                                                                         
                  fi                                                                                   

                    ;;                                                                                 
                up)                                                                                         
                     echo "up"     
                     ##logic                                                                    
                     ;;                                                                                
                down)                                                                                  
                     echo "down" 
                     ##logic                                                                     
                    ;;                                                                                 
                *)                                                                                     
                    echo "Usage: $0 {up | down} dev"                                                
                    exit 1                                                                             
                    ;;                                                                                 
esac         

最初case .. in .... esacにがなければ、正常に動作します。でcase ... in ... esac、それはのための空白のオプションを提供します-b

$ ./nepleaks_upd.sh bootstrap -b off
option1 = ?
option2 = 
Usage: ./nepleaks_upd.sh [bootstrap | up | down]  [-b <on/off>]

使用する前にオプションをチェックしてはいけません$1か?
unxnut 14

@unxnutそれは同じものの仲間を歌います
prayagupd

「最初にcase .. in .... esac、それがなければうまくいく」とはどういう意味ですか?5から25行目が./nepleaks_upd.sh -b off正しく解析されるということですか?多分あなたはを必要とするshiftのでgetopts、「bootstrap」を詰まらせないでください。
スコット

@スコットはい、まさにその部分はうまくいきます。
prayagupd 14

回答:


12

getopts最初の引数で解析を開始し、最初の非オプション引数で停止します。これは標準的な規則です。一部のGNUユーティリティは引数の後にオプションを受け入れますが、通常、somecommand foo -bar quxでは-bar、オプションとして解析されません。

の後bootstrapにオプションの解析を開始する場合は、それを示す必要があります。変数をgetopts使用して、OPTIND現在の位置を記憶します。OPTIND値は1から始まります。最初の引数をスキップするには、2に設定します。

case "$1" in
   bootstrap)
      OPTIND=2
      while getopts ":b:" o; do
          

あるいは、shiftすでに処理した引数を使用することもできます。

subcommand=$1; shift
case "$subcommand" in
    bootstrap)
      while getopts ":b:" o; do
          
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.