EDIT: Xin vui lòng, vui lòng , vui lòng đọc hai yêu cầu được liệt kê ở cuối bài đăng này trước khi trả lời. Mọi người tiếp tục đăng các đá quý và thư viện mới của họ và những thứ khác, rõ ràng là không đáp ứng yêu cầu.
Đôi khi tôi muốn hack một số tùy chọn dòng lệnh thành một tập lệnh đơn giản với giá rất rẻ. Một cách thú vị để làm điều đó, mà không cần xử lý getopts hoặc phân tích cú pháp hoặc bất cứ điều gì tương tự, là:
...
$quiet = ARGV.delete('-d')
$interactive = ARGV.delete('-i')
...
# Deal with ARGV as usual here, maybe using ARGF or whatever.
Nó không hoàn toàn là cú pháp tùy chọn Unix bình thường, vì nó sẽ chấp nhận các tham số dòng lệnh không phải tùy chọn tùy chọn, như trong " myprog -i foo bar -q
", nhưng tôi có thể sống với điều đó. (Một số người, chẳng hạn như các nhà phát triển Subversion, thích điều này. Đôi khi tôi cũng vậy.)
Một tùy chọn chỉ có mặt hoặc không có mặt không thể được thực hiện đơn giản hơn nhiều so với tùy chọn trên. (Một phép gán, một lệnh gọi hàm, một tác dụng phụ.) Có cách nào đơn giản như nhau để xử lý các tùy chọn có tham số, chẳng hạn như " -f
tên tệp " không?
BIÊN TẬP:
Một điểm mà tôi đã không nói trước đó, bởi vì điều đó đã không trở nên rõ ràng với tôi cho đến khi tác giả của Trollop đề cập rằng thư viện vừa vặn "trong một tệp [800 dòng]", đó là tôi không chỉ tìm kiếm sự sạch sẽ cú pháp, nhưng đối với một kỹ thuật có các đặc điểm sau:
Toàn bộ mã có thể được bao gồm trong tệp kịch bản (mà không lấn át bản thân tập lệnh thực, có thể chỉ vài chục dòng), vì vậy người ta có thể thả một tệp duy nhất trong một
bin
dir trên bất kỳ hệ thống nào có Ruby 1.8 tiêu chuẩn [5-7] cài đặt và sử dụng nó. Nếu bạn không thể viết một tập lệnh Ruby không có câu lệnh yêu cầu và mã để phân tích cú pháp một vài tùy chọn dưới hàng chục dòng hoặc lâu hơn, bạn không đạt yêu cầu này.Mã này đủ nhỏ và đơn giản để người ta có thể nhớ đủ để nhập trực tiếp mã sẽ thực hiện thủ thuật, thay vì cắt và dán từ một nơi khác. Hãy nghĩ đến tình huống bạn đang ở trên bảng điều khiển của một máy chủ có tường lửa không có quyền truy cập Internet và bạn muốn tập hợp một tập lệnh nhanh để khách hàng sử dụng. Tôi không biết bạn thế nào, nhưng (ngoài việc không đạt yêu cầu ở trên) thì việc ghi nhớ ngay cả 45 dòng của bảng mã vi mô đơn giản không phải là điều tôi quan tâm.
getoptlong
và optparse
đều nằm trong thư viện ruby chuẩn, vì vậy bạn không CẦN sao chép chúng khi triển khai tập lệnh của mình - nếu ruby hoạt động trên máy đó thì require 'optparse'
hoặc require 'getoptlong'
cũng sẽ hoạt động.