Pertanyaan Penguraian argumen naskah shell


Ada sejumlah pertanyaan tentang hal semacam ini tetapi mari kita bayangkan kita menargetkan sistem Linux generik dengan baik getopt dan getopts diinstal (bukan yang kami akan gunakan baik, tetapi mereka tampaknya populer)

Bagaimana saya menguraikan kedua panjang (--contoh | - contoh sederhana-opsi) dan argrumen pendek (-e | -simple-example | -e simple-example)


18
2018-04-15 04:22


asal


Jawaban:


Anda ingin menggunakannya getopt dengan opsi panjang dan pendek. Contoh dari kode yang berfungsi:

# Parse arguments
TEMP=$(getopt -n $PROGRAM_NAME -o p:P:cCkhnvVS \
--long domain-password:,pop3-password:\         
,create,cron,kill,help,no-sync-passwords,version,verbose,skip-pop3 \
-- "$@")                                                            

# Die if they fat finger arguments, this program will be run as root
[ $? = 0 ] || die "Error parsing arguments. Try $PROGRAM_NAME --help"       

eval set -- "$TEMP"
while true; do     
        case $1 in 
                -c|--create)
                        MODE="CREATE"; shift; continue
                ;;                                    
                -C|--cron)                            
                        MODE="CRON"; shift; continue  
                ;;                                    
                -k|--kill)                            
                        MODE="KILL"; shift; continue  
                ;;                                    
                -h|--help)                            
                        usage                         
                        exit 0                        
                ;;                                    
                -n|--no-sync-passwords)               
                        SYNC_VHOST=0; shift; continue 
                ;;                                    
                -p|--domain-password)                 
                        DOMAIN_PASS="$2"; shift; shift; continue
                ;;                                              
                -P|--pop3-password)                             
                        POP3_PASS="$2"; shift; shift; continue  
                ;;                                              
                -v|--version)                                   
                        printf "%s, version %s\n" "$PROGRAM_NAME" "$PROGRAM_VERSION"
                        exit 0                                                      
                ;;                                                                  
                -v|--verbose)                                                       
                        VERBOSE=1; shift; continue                                  
                ;;                                                                  
                -S|--skip-pop3)                                                     
                        SKIP_POP=1; shift; continue                                 
                ;;                                                                  
                --)                                                                 
                        # no more arguments to parse                                
                        break                                                       
                ;;                                                                  
                *)                                                                  
                        printf "Unknown option %s\n" "$1"                           
                        exit 1                                                      
                ;;                                                                  
        esac                                                                        
done     

Catatan, die adalah fungsi yang didefinisikan sebelumnya (tidak ditampilkan).

Itu -n opsi memberi tahu getopt untuk melaporkan kesalahan sebagai nama program saya, bukan sebagai getopt. -o mendefinisikan daftar opsi singkat (: setelah opsi menunjukkan argumen yang diperlukan) dan --long menentukan daftar opsi panjang (sesuai untuk opsi singkat).

Sisanya hanyalah sebuah saklar sederhana, menelepon shift tepat untuk memajukan penunjuk argumen. Perhatikan, menelepon shift; shift; hanyalah kebiasaan yang sulit. Di dunia modern saat ini, shift 2 mungkin akan cukup.

Getopt modern cukup konsisten di atas platform yang lebih baru, namun Anda mungkin mengalami beberapa masalah portabilitas pada sistem yang lebih lama (sekitar Redhat 9). Lihat man getopt untuk informasi tentang kompatibilitas mundur. Namun itu tidak mungkin bahwa Anda akan mengalami kebutuhan untuk itu.

Akhirnya, setelah opsi penguraian, Anda dapat sekali lagi memanggil:

eval set -- "$@"

Ini akan memindahkan penunjuk argumen ke yang lain yang tersisa pada baris perintah setelah getopt selesai melakukan opsi parsing. Anda kemudian bisa shift untuk terus membacanya. Misalnya, jika perintah tampak seperti ini:

./foo --option bar file1.txt file2.txt file3.txt

Jangan lupa untuk membuatnya berguna -h / --help pilihan untuk mencetak opsi mewah baru Anda setelah Anda selesai. :) Jika Anda membuat output itu help2man ramah, Anda memiliki halaman manual instan untuk pergi dengan alat baru Anda.

Edit

Pada sebagian besar distribusi, Anda dapat menemukan lebih banyak contoh getopt kode di /usr/share/doc/util-linux/examples, yang seharusnya sudah terinstal secara default.


33
2018-04-15 07:47