2010-03-02 33 views
8

Tôi không biết Ruby rất tốt, nhưng tôi đang cố thêm một số chức năng vào tập lệnh này mà một đồng nghiệp đã viết.Làm thế nào để sử dụng các đối số biến với tùy chọn của ruby ​​OptionParser

Về cơ bản, phải mất một vài cờ và tiêu chuẩn làm đầu vào và nó sử dụng OptionParser để phân tích cú pháp cờ.

Tôi muốn sử dụng OptionParser để phân tích cú pháp lựa chọn các đối số dòng lệnh tương tự như đối số của con mèo. Vì vậy, tôi đoán câu hỏi của tôi là làm thế nào tôi sẽ viết các tùy chọn dòng lệnh phân tích một phần của con mèo trong ruby ​​bằng cách sử dụng OptionParser

cat [OPTION]... [FILE]... 

Hy vọng rằng có ý nghĩa, bất kỳ trợ giúp được đánh giá cao.

+0

Bạn đang hỏi cách giải quyết các đối số không chuyển đổi ([FILE])? –

+0

Có, tôi đã có thể viết mã cho tất cả các tùy chọn chuyển đổi, nhưng tôi không biết cách xử lý số lượng tệp vô hạn được liệt kê sau đó. Xin lỗi tôi đã không rõ ràng. – icco

+0

Xin lỗi, tôi đã cập nhật câu trả lời của mình. Sau khi phân tích tất cả các tùy chọn, bạn nên để lại ARGV dưới dạng một mảng tên tệp. Giả sử rằng người dùng đã nhập một dòng lệnh hợp lệ, nghĩa là. – Shadowfirebird

Trả lời

8
OPTS = {} 

op = OptionParser.new do |x| 
    x.banner = 'cat <options> <file>'  
    x.separator '' 

    x.on("-A", "--show-all", "Equivalent to -vET")    
     { OPTS[:showall] = true }  

    x.on("-b", "--number-nonblank", "number nonempty output lines") 
     { OPTS[:number_nonblank] = true }  

    x.on("-x", "--start-from NUM", Integer, "Start numbering from NUM")   
     { |n| OPTS[:start_num] = n } 

    x.on("-h", "--help", "Show this message") 
     { puts op; exit } 

end 

op.parse!(ARGV) 

# Example code for dealing with filenames 
ARGV.each{ |fn| output_file(OPTS, fn) } 

Tôi sẽ để lại các hoạt động dòng lệnh khác, như họ nói, như một bài tập cho người đọc! Bạn có được ý tưởng.

(NB: Tôi đã phải phát minh ra một tham số -x hư cấu để giới thiệu qua một giá trị sau khi một lá cờ.)

Cập nhật: Tôi nên đã giải thích rằng điều này sẽ rời argv như một loạt các tên tập tin, giả định rằng người dùng đã nhập bất kỳ.

+0

Vì vậy, vấn đề với điều này là nó chỉ hỗ trợ một tệp. Những gì tôi thực sự cố gắng tìm ra là làm thế nào để đối phó với thực tế là có 4 tập tin trên dòng lệnh. Cho phép nói một cuộc gọi như "cat a.txt b.txt c.txt d.txt". – icco

+1

Không, ARGV phải là một mảng có một phần tử cho mỗi từ còn lại trên dòng lệnh sau khi các tùy chọn được xử lý. Trong ví dụ của bạn nó sẽ có bốn yếu tố. – Shadowfirebird

+2

@icco 'đặt ARGV.inspect # => [" a.txt "," b.txt "," c.txt "," d.txt "]' –

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