ruby - wie richtig analysiert, unterschiedliche Anzahl von Kommandozeilen-Argumenten
n00b-Frage-Alarm!
hier ist das problem:
Ich bin erstellen Sie ein shell-Skript, das dauert mindestens 3 Argumente: ein string eine Zeilennummer, und mindestens eine Datei.
Habe ich ein Skript geschrieben, wird akzeptieren, dass GENAU 3 Argumente, aber ich weiß nicht, wie, um mehrere Dateinamen Argumente.
hier sind die relevanten Teile meines Codes (das überspringen der Schrift zurück in die Datei, etc):
#!/usr/bin/env ruby
the_string = ARGV[0]
line_number = ARGV[1]
the_file = ARGV[2]
def insert_script(str, line_n, file)
f = file
s = str
ln = line_n.to_i
if (File.file? f)
read_in(f,ln,s)
else
puts "false"
end
end
def read_in(f,ln,s)
lines = File.readlines(f)
lines[ln] = s + "\n"
return lines
end
# run it
puts insert_script(the_string, line_number, the_file)
jetzt weiß ich, dass es einfach ist zu schreiben, ein block, durchläuft ALLE Argumente:
ARGV.each do |a|
puts a
end
aber ich muss NUR eine Schleife durch die args aus ARGV[2] (die erste Datei-name) zu den letzten Dateinamen.
Ich weiß, dass es - mindestens - mindestens eine einfache Möglichkeit, dies zu tun, aber ich kann einfach nicht sehen, was Sie im moment ist!
in jedem Fall - ich würde mehr als glücklich sein, wenn jemand nur zeigen Sie mir ein tutorial oder ein Beispiel, ich bin sicher, es gibt viele gibt - aber ich kann nicht scheinen, um Sie zu finden.
Dank
- Super Antworten von allen! vielen Dank an alle. es ist in der Regel nicht der Fall, dass ich verstehe, oder nutzen Sie viele der Antworten, die ich hier bekommen - also entweder bin ich klüger oder war dies eine besonders leichte Frage, oder Ihr seid einfach guter Erklärer... oder einige combo-alle drei! cheers, B
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie ändern die
ARGV
array zu entfernen, die Elemente, die Sie sind nicht länger daran interessiert, die Behandlung als Dateinamen können Sie behandeln alle verbleibenden Elemente wie Dateinamen und Durchlaufen Ihren Inhalt mitARGF
.Das ist ein Schluck, ein kleines Beispiel zeigen, wird es leichter:
argf.rb
:Gibt es zwei Kopien der
argf.rb
Datei auf der Konsole ausgegeben, weil ich gab die mit dem Namenargf.rb
zweimal auf der Kommandozeile. Es wurde geöffnet, und der Iteration für jedes mal erwähnen.Wenn Sie aktiv werden wollen, auf der Dateien als Dateien, sondern als zu Lesen Ihre Inhalte, können Sie einfach ändern Sie die
ARGV
array und verwenden Sie dann die verbleibenden Elemente direkt.Würden Sie erwägen, eine hilfreiche gem? Trollop ist ideal für die Befehlszeile Parsen, da es automatisch Ihnen helfen, Nachrichten, lange und kurze command-line switches, etc.
Wenn ich nenne es "commandline.rb" und führen Sie es:
Den kanonischen Weg ist die Verwendung
shift
etwa so:Werfen Sie einen Blick auf OptionParser - http://ruby-doc.org/stdlib-1.9.3/libdoc/optparse/rdoc/OptionParser.html. Es ermöglicht Ihnen die Angabe der Anzahl der Argumente, ob Sie obligatorisch oder optional Griff-Fehler, wie MissingArgument oder InvalidOption.
Eine Alternative (und etwas hässlicher) Stich, wenn Sie nicht möchten, dass die Verwendung einer anderen Bibliothek oder änderung der ARGV-array zu verwenden .bis zu