2012-07-01 27 views
27

Có thể sử dụng getopts để xử lý nhiều tùy chọn cùng nhau không? Ví dụ, myscript -iR hoặc myscript -irv.bash getopts với nhiều tùy chọn bắt buộc

Ngoài ra, tôi có tình huống dựa trên tập lệnh điều kiện sẽ cần tùy chọn bắt buộc. Ví dụ: nếu đối số cho tập lệnh là thư mục, tôi sẽ cần chỉ định tùy chọn -R hoặc -r cùng với bất kỳ tùy chọn nào khác (myscript -iR mydir hoặc myscript -ir mydir hoặc myscript -i -r mydir hoặc myscript -i -R mydir), trong trường hợp tệp chỉ -i là đủ (myscript -i myfile).

Tôi đã cố tìm kiếm nhưng không nhận được bất kỳ câu trả lời nào.

Trả lời

73

Bạn có thể ghép các tùy chọn bạn cung cấp và getopts sẽ tách chúng ra. Trong tuyên bố case của bạn, bạn sẽ xử lý từng tùy chọn riêng lẻ.

Bạn có thể đặt cờ khi tùy chọn được nhìn thấy và kiểm tra để đảm bảo "tùy chọn" bắt buộc (!) Bắt đầu sau khi vòng lặp getopts hoàn tất.

Dưới đây là một ví dụ:

#!/bin/bash 
rflag=false 
small_r=false 
big_r=false 

usage() { echo "How to use"; } 

options=':ij:rRvh' 
while getopts $options option 
do 
    case $option in 
     i ) i_func;; 
     j ) j_arg=$OPTARG;; 
     r ) rflag=true; small_r=true;; 
     R ) rflag=true; big_r=true;; 
     v ) v_func; other_func;; 
     h ) usage; exit;; 
     \?) echo "Unknown option: -$OPTARG" >&2; exit 1;; 
     : ) echo "Missing option argument for -$OPTARG" >&2; exit 1;; 
     * ) echo "Unimplemented option: -$OPTARG" >&2; exit 1;; 
    esac 
done 

shift $(($OPTIND - 1)) 

if ! $rflag && [[ -d $1 ]] 
then 
    echo "-r or -R must be included when a directory is specified" >&2 
    exit 1 
fi 

này thể hiện một thực hiện tham khảo đầy đủ của một hàm getopts, nhưng chỉ là một phác thảo của một kịch bản lớn hơn.

+1

Rất cám ơn Dennis. Tôi đã sử dụng những lá cờ như bạn đề nghị. Tôi đã cố gắng đơn giản hóa logic bằng cách nối các tùy chọn và lưu trữ chúng trong một biến và sau đó xử lý dựa trên các tùy chọn được cung cấp. –

+0

@RameshSamane: Bạn được chào đón. Nếu bạn thấy câu trả lời của tôi hữu ích, vui lòng đánh dấu câu trả lời là đã được chấp nhận. –

+0

Tôi đã cố gắng nhưng nhận được thông báo "Bỏ phiếu yêu cầu 15 danh tiếng". Tuy nhiên, tôi đã nhấp vào "Có" ở cuối chuỗi cho câu hỏi "Bài đăng này có hữu ích cho bạn không?" và nhận được thông báo "Cảm ơn bạn đã phản hồi". –

Các vấn đề liên quan