2010-03-02 13 views
8

Nie znam ruby ​​bardzo dobrze, ale próbuję dodać trochę funkcjonalności do skryptu napisanego przez współpracownika.Jak używać zmiennych argumentów z OptionParser ruby ​​

Zasadniczo w tej chwili zajmuje kilka flag i standardowe jako dane wejściowe i używa OptionParser do parsowania flag.

Chcę użyć OptionParser do analizy wybranych argumentów linii poleceń podobnych do tych z cat. Więc myślę, że moje pytanie jest jak chciałbym napisać opcje wiersza polecenia analizowania część kota w Ruby przy użyciu OptionParser

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

nadzieję, że ma sens, każda pomoc jest mile widziana.

+0

Czy pytasz, jak radzić sobie z argumentami bez przełączania ([PLIK])? –

+0

Tak, udało mi się napisać kod dla wszystkich opcji przełącznika, ale nie wiem, jak sobie poradzić z nieskończoną liczbą plików wymienionych po tym. Przepraszam, byłem niejasny. – icco

+0

Przepraszam, zaktualizowałem swoją odpowiedź. Po przeanalizowaniu wszystkich opcji należy pozostawić ciąg ARGV jako tablicę nazw plików. Zakładając, że użytkownik wprowadził prawidłową linię poleceń, to znaczy. – Shadowfirebird

Odpowiedz

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) } 

Zostawię inne operacje z linii poleceń, jak mówią, jako ćwiczenie dla czytelnika! Masz pomysł.

(NB: Musiałem wymyślić fikcyjną parametr -x demo przekazując wartość po fladze.)

Aktualizacja: Powinienem wyjaśnić, że pozostawi ARGV jako tablica nazw, przy założeniu, że użytkownik wprowadził dowolny.

+0

Problem z tym, że obsługuje tylko jeden plik. Naprawdę staram się dowiedzieć, jak sobie poradzić z tym, że w linii poleceń znajdują się 4 pliki. Powiedzmy, że dzwonisz jak "cat a.txt b.txt c.txt d.txt". – icco

+1

Nie, ARGV powinna być tablicą z jednym elementem dla każdego słowa pozostałego w wierszu poleceń po przetworzeniu opcji. W twoim przykładzie miałoby to cztery elementy. – Shadowfirebird

+2

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

Powiązane problemy