Sử dụng getopts để phân tích các tùy chọn sau một đối số không phải tùy chọn


10

Tôi có một tập lệnh bash như dưới đây trong một tập tin nepleaks_upd.sh, mà tôi muốn chạy như ./nepleaks_upd.sh bootstrap --branch off. Không thể làm cho nó để lấy --branch, nhưng những gì nó hoạt động là ./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         

Không có đầu tiên case .. in .... esac, nó hoạt động tốt. Với case ... in ... esac, nó cung cấp tùy chọn trống cho -b,

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

Bạn không nên kiểm tra các tùy chọn trước khi sử dụng $1?
unxnut

@unxnut Nó hát samet Breath bro
nguyện

Ý của bạn là gì Nếu không có đầu tiên case .. in .... esac, nó hoạt động tốt? Bạn có nghĩa là dòng 5-25 phân tích ./nepleaks_upd.sh -b offchính xác? Có lẽ bạn cần một cái shift, vì vậy, getoptskhông bị sặc trên cái Hồi giáo bootstrap.
Scott

@Scott Có, chính xác là phần đó hoạt động tốt.
nguyện

Câu trả lời:


12

getoptsbắt đầu phân tích cú pháp tại đối số đầu tiên và dừng lại ở các đối số không phải tùy chọn đầu tiên. Đó là quy ước chuẩn - một số tiện ích GNU chấp nhận các tùy chọn sau các đối số, nhưng điều bình thường là trong somecommand foo -bar qux, -barkhông được phân tích cú pháp như một tùy chọn.

Nếu bạn muốn bắt đầu phân tích các tùy chọn sau bootstrap, bạn cần chỉ ra điều đó. getoptssử dụng OPTINDbiến để ghi nhớ vị trí của nó. OPTINDbắt đầu với giá trị 1. Để bỏ qua đối số đầu tiên, đặt thành 2.

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

Ngoài ra, bạn có thể shiftcác đối số mà bạn đã xử lý.

subcommand=$1; shift
case "$subcommand" in
    bootstrap)
      while getopts ":b:" o; do
          
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.