옵션이 아닌 인수 다음에 옵션을 구문 분석하기 위해 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

@unxnut 그것은 같은 노래를 부릅니다
prayagupd

“먼저 case .. in .... esac잘 작동합니다”는 무슨 뜻 입니까? 5-25 행이 ./nepleaks_upd.sh -b off올바르게 구문 분석되었음을 의미 합니까? 어쩌면 당신이 필요 shift하므로 getopts" bootstrap" 에 질식하지 마십시오 .
Scott

@Scott 네, 정확히 그 부분은 잘 작동합니다.
prayagupd

답변:


12

getopts첫 번째 인수에서 구문 분석을 시작하고 첫 번째 비 옵션 인수에서 중지합니다. 일부 GNU 유틸리티를 인수 한 후 옵션을 적용하지만, 일상적인 일이있는 것입니다 - 즉 표준 협약 somecommand foo -bar qux, -bar옵션으로 해석되지 않습니다.

이후에 구문 분석 옵션을 시작 bootstrap하려면이를 표시해야합니다. 변수를 getopts사용하여 OPTIND현재 위치를 기억합니다. OPTIND첫 번째 인수를 건너 뛰려면 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.