옵션이 아닌 매개변수 뒤의 옵션을 구문 분석하려면 getopts를 사용하세요.

옵션이 아닌 매개변수 뒤의 옵션을 구문 분석하려면 getopts를 사용하세요.

파일에 아래와 같은 bash 스크립트가 있고 nepleaks_upd.sh.bashrc로 실행하고 싶습니다 ./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

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

관련 정보