Analysieren von Befehlszeilenoptionen nach Ruby-Art (OptionParser)

Ruby ist mit dem leistungsstarken und flexiblen Tool OptionParser ausgestattet, mit dem Befehlszeilenoptionen analysiert werden können. Wenn Sie erst einmal gelernt haben, wie Sie dies anwenden, können Sie ARGV nicht mehr manuell durchsuchen. OptionParser verfügt über eine Reihe von Funktionen, die es für Ruby-Programmierer sehr attraktiv machen. Wenn Sie jemals Optionen von Hand in Ruby oder C oder mit der geparst haben getoptlong C-Funktion, werden Sie sehen, wie willkommen einige dieser Änderungen sind.

  • OptionParser ist TROCKEN. Sie müssen den Befehlszeilenschalter, seine Argumente, den Code, der ausgeführt werden soll, wenn er auftritt, und die Beschreibung des Befehlszeilenschalters nur einmal in Ihr Skript schreiben. OptionParser generiert automatisch Hilfebildschirme für Sie aus dieser Beschreibung und leitet alles über das Argument aus seiner Beschreibung ab. Zum Beispiel wird es das wissen --Datei [DATEI] option ist optional und akzeptiert ein einzelnes Argument. Auch wird es das wissen --[-no] -verbose ist wirklich zwei Möglichkeiten und wird beide Formen akzeptieren.
  • OptionParser konvertiert Optionen automatisch in eine bestimmte Klasse. Wenn die Option eine Ganzzahl annimmt, kann sie jede in der Befehlszeile übergebene Zeichenfolge in eine Ganzzahl konvertieren. Dies spart Zeit beim Parsen von Befehlszeilenoptionen.
  • Alles ist sehr in sich geschlossen. Alle Optionen befinden sich an derselben Stelle, und die Auswirkung der Option steht direkt neben der Definition für die Option. Wenn Optionen hinzugefügt, geändert werden müssen oder jemand einfach nur sehen möchte, was er tut, gibt es nur einen Ort, an dem er suchen kann. Sobald die Befehlszeile analysiert wurde, enthält ein einzelnes Hash oder OpenStruct die Ergebnisse.

Genug schon, zeig mir Code

Hier ist ein einfaches Beispiel für die Verwendung OptionParser. Es werden keine erweiterten Funktionen verwendet, nur die Grundlagen. Es gibt drei Optionen, von denen eine einen Parameter übernimmt. Alle Optionen sind obligatorisch. Da sind die -v / - ausführlich und -q / - schnell Optionen sowie die -l / - Logdatei DATEI Möglichkeit. Darüber hinaus erstellt das Skript eine Liste von Dateien, die von den Optionen unabhängig sind.

 #! / usr / bin / env ruby

 # Ein Skript, das vorgibt, die Größe einer Reihe von Bildern zu ändern

 erfordern 'optparse'

 

 # Dieser Hash enthält alle Optionen

 # geparst von der Kommandozeile aus

 # OptionParser.

 options = 

 

 optparse = OptionParser.new do | opts |

   # Legen Sie ein Banner fest, das oben angezeigt wird

   # des Hilfebildschirms.

   opts.banner = "Verwendung: optparse1.rb [Optionen] file1 file2…"

 

   # Definieren Sie die Optionen und was sie tun

   options [: verbose] = false

   opts.on ('-v', '--verbose', 'Weitere Informationen ausgeben')

     options [: verbose] = true

   Ende

 

   options [: quick] = false

   opts.on ('-q', '--quick', 'Task schnell ausführen')

     options [: quick] = true

   Ende

 

   options [: logfile] = nil

   opts.on ('-l', '--logfile FILE', 'Write log to FILE') do | file |

     options [: logfile] = file

   Ende

 

   # Dies zeigt den Hilfebildschirm an, alle Programme sind

   Es wird davon ausgegangen, dass # diese Option hat.

   opts.on ('-h', '--help', 'Diesen Bildschirm anzeigen')

     setzt opts

     Ausfahrt

   Ende

 Ende

 

 # Analysieren Sie die Befehlszeile. Denken Sie daran, es gibt zwei Formen

 # der Analysemethode. Die 'parse'-Methode analysiert einfach

 # ARGV, während das 'Parsen!' Methode analysiert ARGV und entfernt

 # dort gefundene Optionen sowie Parameter für

 # die Optionen. Was bleibt, ist die Liste der Dateien, deren Größe geändert werden soll.

 optparse.parse!

 

 setzt "wortreich sein" wenn Optionen [: wortreich]

 setzt "schnell sein" wenn Optionen [: schnell]

 setzt "Logging to file # options [: logfile]" wenn options [: logfile]

 

 ARGV.each do | f |

   Setzt "Bildgröße ändern # f ..."

   schlaf 0,5

 Ende

Überprüfung des Codes

Zunächst die optparse Bibliothek ist erforderlich. Denken Sie daran, das ist kein Juwel. Ruby ist im Lieferumfang enthalten, sodass Sie keinen Edelstein installieren oder benötigen Rubygems Vor optparse.

In diesem Skript gibt es zwei interessante Objekte. Das erste ist Optionen, am obersten Geltungsbereich deklariert. Es ist ein einfacher leerer Hash. Wenn Optionen definiert sind, schreiben sie ihre Standardwerte in diesen Hash. Beispielsweise ist das Standardverhalten für dieses Skript nicht wortreich sein Optionen [: ausführlich] ist auf false gesetzt. Wenn Optionen in der Befehlszeile gefunden werden, ändern sie die Werte in Optionen um ihre Wirkung zu reflektieren. Zum Beispiel, wenn -v / - ausführlich angetroffen wird, wird es true zuweisen Optionen [: ausführlich].

Das zweite interessante Objekt ist optparse. Dies ist das OptionParser Objekt selbst. Wenn Sie dieses Objekt erstellen, übergeben Sie ihm einen Block. Dieser Block wird während der Erstellung ausgeführt und erstellt eine Liste von Optionen in internen Datenstrukturen und bereitet sich darauf vor, alles zu analysieren. In diesem Block geschieht die ganze Magie. Hier legen Sie alle Optionen fest.

Optionen definieren

Jede Option folgt demselben Muster. Sie schreiben zuerst den Standardwert in den Hash. Dies wird geschehen, sobald der OptionParser ist konstruiert. Als nächstes rufst du die auf Methode, die die Option selbst definiert. Es gibt verschiedene Formen dieser Methode, aber hier wird nur eine verwendet. In den anderen Formularen können Sie automatische Typkonvertierungen und Wertesätze definieren, auf die eine Option beschränkt ist. Die drei hier verwendeten Argumente sind die Kurzform, die Langform und die Beschreibung der Option.

Das auf Methode wird eine Reihe von Dingen aus der langen Form schließen. Eine Sache, auf die man schließen kann, ist das Vorhandensein von Parametern. Wenn für die Option Parameter vorhanden sind, werden diese als Parameter an den Block übergeben.

Wenn die Option in der Befehlszeile angezeigt wird, wird der Block an die übergeben auf Methode wird ausgeführt. Hier machen die Blöcke nicht viel, sie setzen nur Werte im Options-Hash. Es könnte noch mehr getan werden, z. B. um zu überprüfen, ob eine Datei existiert, auf die verwiesen wird. Bei Fehlern können Ausnahmen von diesen Blöcken geworfen werden.

Schließlich wird die Befehlszeile analysiert. Dies geschieht durch Aufrufen der analysieren! Methode auf einem OptionParser Objekt. Es gibt tatsächlich zwei Formen dieser Methode, analysieren und analysieren!. Wie die Version mit dem Ausrufezeichen impliziert, ist es destruktiv. Es analysiert nicht nur die Befehlszeile, sondern entfernt auch alle gefundenen Optionen ARGV. Dies ist wichtig, da nur die Liste der Dateien nach den Optionen in angezeigt wird ARGV.