การใช้ getopts เพื่อแยกวิเคราะห์ตัวเลือกหลังจากอาร์กิวเมนต์ที่ไม่ใช่ตัวเลือก


10

ฉันมีสคริปต์ทุบตีดังต่อไปนี้ในแฟ้มที่ฉันต้องการที่จะทำงานเป็น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 มันร้องเพลง samething bro
prayagupd

คุณหมายถึงอะไรโดย“ ถ้าไม่ก่อนcase .. in .... esacก็ใช้ได้ดี” คุณหมายถึงบรรทัดที่ 5-25 แยกวิเคราะห์./nepleaks_upd.sh -b offอย่างถูกต้องหรือไม่ บางทีคุณอาจต้องการ a shiftดังนั้นgetoptsอย่าสำลัก " bootstrap"
สกอตต์

@Scott ใช่ส่วนนั้นทำงานได้ดี
prayagupd

คำตอบ:


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.