Programmieren ohne Hindernisse

Einfache Skripte mit Ruby erstellen

01.05.2006
Durch und durch objektorientiert mit einfacher, reichhaltiger Syntax: Ruby stellt sich dem Programmierer nicht in den Weg. Ein praktisches Beispiel demonstriert die Möglichkeiten.

Die Web-Seite [1] von Ruby klassifiziert die Sprache als objektorientierte Skriptsprache. Mit diesen Merkmalen eignet sich die Sprache gut, um schnell das ein oder andere Helferlein für die tägliche Arbeit mit Linux zu schreiben. Dies demonstriert das hier beschriebene, kleine Skript: Es liest zwei Verzeichnisbäume ein, vergleicht diese miteinander und gibt die Unterschiede aus. Um die einzelnen Schritte nachzuvollziehen, benötigen Sie eine funktionierende Ruby-Umgebung. Diesen findet sich unter Debian oder Suse im Paket ruby.

Dieser Artikel beschreibt nicht Grundlagen des Programmierens. Hier hilft der Einführungsartikel im Schwerpunkt dieser Ausgabe weiter. Zu Ruby selbst gibt es exzellente, frei erhältliche Bücher ([2], [3], [4], [5]). Eine Dokumentation im HTML-Format enthalten etwa das Suse-Paket ruby-doc-html sowie die Debian-Archive ruby-manual und rubybook. Bei letzterem handelt es sich um das Buch "Programming Ruby" [3].

Für das schnelle Nachschlagen in der Ruby-Referenz eignet sich der Befehl ri. Er findet sich bei Suse in ruby-doc-ri, unter Debian im Paket ri. Die Referenz ist auch online verfügbar [6]. Auch eine Schnell-Referenz existiert als freies Dokument [7].

Abbildung 1: Das RubyGarden-Wiki ist eine Fundgrube zu Informationen rund um Ruby.

Für das einfache Ausprobieren empfiehlt sich die Installation von Interactive Ruby. Suse integriert das interaktive Ruby bereits im Paket ruby, bei Debian installieren Sie das Paket irb. Das Programm erlaubt es, interaktiv Befehle auszuprobieren. Mit der Eingabe von exit beendet sich das Testprogramm.

TIPP

Einige Regeln helfen, die Beispiele besser zu verstehen: Variablennamen schreibt man in Ruby klein; Konstanten-, Klassen- oder Objektnamen beginnen mit einem Großbuchstaben. Es hat sich die Konvention eingebürgert, die Namen von Konstanten komplett groß zu schreiben.

Verzeichnisbäume vergleichen

Das Beispiel in diesem Artikel implementiert einen einfachen Vergleich zweier Verzeichnisbäume (siehe Listing 1). Es nutzt die High-Level-Funktionen von Ruby und dessen Bibliotheken getreu dem Motto: Was andere schon programmiert haben, brauche ich nicht selbst zu machen.

Dabei verhält sich dirdiff.rb wie ein waschechter Shell-Befehl, wenn es mit chmod u+x dirdiff.rb das Ausführungs-Recht erhält. So vergleicht ./dirdiff.rb -i ~/.kde ~/backup/.kde das Verzeichnis ~/.kde mit dem Verzeichnis ~/backup.kde. Es zeigt an, welche Dateien in ersterem vorhanden sind, jedoch im Backup-Verzeichnis fehlen und umgekehrt. Aufgrund der Option -i ignoriert das Skript beim Sortieren die Groß- und Kleinschreibung der Pfadnamen.

Abbildung 2: Ein Durchlauf des Skriptes bringt es ans Tageslicht: Der Editor Kate kam beim Editieren des Ruby-Codes zum Einsatz.

Die erste Zeile des Skripts gibt an, welcher Interpreter zum Einsatz kommt. Der Befehl env findet ruby im Suchpfad. Das hilft, falls ruby nicht in /usr/bin/ruby installiert ist.

Abbildung 3: Gängige Editoren bieten Syntax-Highlighting und mehr für Ruby-Skripte.

In Zeile 3 bindet das Skript eine Klasse zum Auswerten von Befehlszeilen-Argumenten ein. Mit ri OptionParser erfahren Sie im Handumdrehen mehr über diese Klasse, für die es auch ein deutschsprachiges Tutorial [8] gibt.

Aufrufkonventionen

Im Anschluss definiert das Skript in den Zeilen 5 bis 39 zwei Funktionen, von denen später noch die Rede sein wird. Dann setzt es den Standardwert für die Option, ob es Groß- und Kleinschreibung beim Sortieren beachtet, auf false (Zeile 41). Es richtet den Optionen-Parser ein (Zeile 43), indem es die Methode new des neuen Objekts der Klasse OptionParser aufruft. Dazu wird der Methoden-Name durch einen Punkt getrennt an den Objekt-Namen angehängt.

TIPP

Die Ruby-Dokumentation gibt eine Methode oft als OptionParser#new wieder, im Code wird die Methode aber durch einen Punkt (OptionParser.new) vom Objektnamen getrennt.

Beim Aufruf einer Klassenmethode – ohne eine Instanz der Klasse, ein neues Objekt zu erstellen – ändert sich die Syntax: Nun trennen zwei Doppelpunkte den Methodennamen von der Klasse. So prüft File::exists?(".bashrc"), ob im aktuellen Verzeichnis eine Datei namens .bashrc existiert. Starten Sie irb, um das mal schnell auszuprobieren.

Die Tilde ~ als Synonym für den Namen des Home-Verzeichnisses versteht Ruby indes nicht. Sie wird beim Aufruf unseres Beispiels bereits von der Shell durch den entsprechenden Pfad ersetzt. Ruby selbst kann das auch: So ersetzt "~/.bashrc".gsub(/^~/, ENV['HOME']) das erste Vorkommen von ~ durch den Pfad zum Home-Verzeichnis. Bei Ruby ist also selbst eine Zeichenkette ein Objekt. Mit "~/.bashrc".class finden Sie heraus, welcher Klasse es angehört.

Das Skript verwendet einen Block, um das Einrichten zusammenzufassen und Schreibarbeit zu sparen. Die Klasse übergibt einen Verweis auf das neu eingerichtete Objekt an den Block, der mit do startet und mit end endet (Zeile 44 bis 53). Der Block übernimmt den Verweis als Variable o, die zwischen den beiden Pipe-Zeichen | angegeben ist. Warum das funktioniert, zeigt die Ausgabe von ri OptionParser::new:

OptionParser::new(banner = nil, width = 32, indent = ' ' * 4)
     {|self if block_given?| …}

Lesen Sie die Angaben in den geschweifeten Klammer laut, erkennen Sie ein schönes Feature von Ruby: Die Anweisungen erläutern fast umgangsprachlich, was passiert. Im Block setzt das Skript einen Banner, um den Einsatz des Befehls zu erklären (Zeile 45), sowie einen kurzen Erklärungstext, was der Befehl eigentlich macht (Zeile 47).

Es folgen die Option -i für das Ignorieren der Groß- und Kleinschreibung sowie die Option -h, die eine kurze Hilfe ausgibt und das Skript beendet. Was bei jeder Option geschieht, steht jeweils innerhalb eines weiteren Blocks. Alternativ verwenden Sie bei einem so kurzen Block die geschweiften Klammern { und } anstatt do und end.

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

  • The Answer Girl
    Lauter kaputte Links in Webseiten, nur weil bei ihrer Erstellung Groß- und Kleinschreibung unbeachtet blieb? Dieses Problem lässt sich zum Beispiel mit einem Perl-Skript lösen.
  • Mit dem Raspberry Pi eine Wetterstation anzapfen
    Einige Wetterstationen liefern ihre Messdaten per USB an einen angeschlossenen Rechner. Mit dem Raspberry Pi lassen sich so die Daten auswerten und per Web-Anwendung ins Netz stellen.
  • Mit Python programmieren
    Trotz grafischer Oberflächen führt manchmal kein Weg am Einsatz von Skripts vorbei, die regelmäßige Aufgaben individuell lösen. Einsteigern bietet sich dafür die klar strukturierte Sprache Python an.
  • Typische Fehler in Python-Code vermeiden
    Python ist einfach – aber nicht so einfach, dass man es allein durch Lesen von Code lernen könnte. Mit etwas Hintergrundwissen vermeiden Sie typische Fehler in Python-Code und schreiben so bessere Programme.
  • Präsentationen auf der Kommandozeile
    Wenn's für fast jede Anwendung eine Möglichkeit gibt, alternativ auf grafische oder textbasierter Software zurück zu greifen – warum sollte das bei Vorträgen und Präsentationen anders sein?
Kommentare

Infos zur Publikation

LU 11/2014: VIDEOS BEARBEITEN

Digitale Ausgabe: Preis € 4,95
(inkl. 19% MwSt.)

Mit der Zeitschrift LinuxUser sind Sie als Power-User, Shell-Guru oder Administrator im kleinen Unternehmen monatlich auf dem aktuelle Stand in Sachen Linux und Open Source.

Sie sind sich nicht sicher, ob die Themen Ihnen liegen? Im Probeabo erhalten Sie drei Ausgaben zum reduzierten Preis. Einzelhefte, Abonnements sowie digitale Ausgaben erwerben Sie ganz einfach in unserem Online-Shop.

NEU: DIGITALE AUSGABEN FÜR TABLET & SMARTPHONE

HINWEIS ZU PAYPAL: Die Zahlung ist auch ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!       

Tipp der Woche

Schnell Multi-Boot-Medien mit MultiCD erstellen
Schnell Multi-Boot-Medien mit MultiCD erstellen
Tim Schürmann, 24.06.2014 12:40, 0 Kommentare

Wer mehrere nützliche Live-Systeme auf eine DVD brennen möchte, kommt mit den Startmedienerstellern der Distributionen nicht besonders weit: Diese ...

Aktuelle Fragen

Artikelsuche
Erwin Ruitenberg, 09.10.2014 07:51, 1 Antworten
Ich habe seit einige Jahre ein Dugisub LinuxUser. Dann weiß ich das irgendwann ein bestimmtes Art...
Windows 8 startet nur mit externer Festplatte
Anne La, 10.09.2014 17:25, 4 Antworten
Hallo Leute, also, ich bin auf folgendes Problem gestoßen: Ich habe Ubuntu 14.04 auf meiner...
Videoüberwachung mit Zoneminder
Heinz Becker, 10.08.2014 17:57, 0 Antworten
Hallo, ich habe den ZONEMINDER erfolgreich installiert. Das Bild erscheint jedoch nicht,...
internes Wlan und USB-Wlan-Srick
Gerhard Blobner, 04.08.2014 15:20, 2 Antworten
Hallo Linux-Forum: ich bin ein neuer Linux-User (ca. 25 Jahre Windows) und bin von WIN 8 auf Mint...
Server antwortet mit falschem Namen
oin notna, 21.07.2014 19:13, 1 Antworten
Hallo liebe Community, Ich habe mit Apache einen Server aufgesetzt. Soweit, so gut. Im Heimnet...