Schleife aus dem Inhalt einer Datei in Ruby

7

Okay, ich bin neu in Ruby und habe einen starken Hintergrund in bash / ksh / sh.

Was ich versuche, ist eine einfache for-Schleife, um einen Befehl über mehrere Server laufen zu lassen. In bash würde ich es so machen:

%Vor%

etc / SERVER_LIST ist nur eine Datei, die wie folgt aussieht:

%Vor%

Ich kann das in Ruby nicht richtig sehen. Das habe ich bisher:

%Vor%

Ich bekomme jetzt diese Fehler:

%Vor%

Die Datei wird richtig bezogen, ich verwende den relativen Pfad, da ich im Verzeichnis unter etc / (nicht / etc) sitze, führe ich dies aus einem Skriptverzeichnis heraus, in dem ich die Datei in einem Unterverzeichnis namens usw.)

    
awojo 07.07.2010, 20:08
quelle

5 Antworten

25
%Vor%

Die erste Zeile öffnet die Datei zum Lesen und geht sofort in einen Block. (Der Block ist der Code zwischen do und end . Sie können Blöcke auch nur mit { und } umgeben. Die Faustregel lautet do..end für mehrzeilige Blöcke und {...} für einzelne Zeilen. Zeilenblöcke.) Blöcke sind in Ruby sehr . Weitaus idiomatischer als eine while oder for Schleife.) Der Aufruf von open erhält das Dateihandle automatisch und Sie geben ihm einen Namen in den Pipes.

Sobald Sie das sozusagen im Griff haben, können Sie each_line aufrufen und darüber hinweg iterieren, als wäre es ein Array. Auch hier führt jede Iteration automatisch eine Zeile, die Sie in den Pipes wie gewünscht benennen.

Das Schöne an dieser Methode ist, dass Sie sich die Mühe sparen, die Datei zu schließen, wenn Sie damit fertig sind. Eine auf diese Weise geöffnete Datei wird automatisch geschlossen, wenn Sie den äußeren Block verlassen.

Eine andere Sache: Die Datei heißt mit hoher Wahrscheinlichkeit /etc/SERVER_LIST . Sie benötigen das anfängliche / , um den Stamm des Dateisystems anzugeben (es sei denn, Sie verwenden absichtlich einen relativen Wert für den Pfad zur Datei, was ich bezweifle). Das allein hat dich vielleicht davon abgehalten, die Datei zu öffnen.

Update für neuen Fehler : Net::SSH wird über den Zeilenumbruch angezeigt. Wo hast du das:

%Vor%

mach es so:

%Vor%

Die Methode chomp entfernt jedes letzte Zeilenumbruchzeichen aus einer Zeichenfolge.

    
Telemachus 07.07.2010, 20:12
quelle
11

Verwenden Sie File.foreach :

%Vor%     
Adrian 07.07.2010 20:12
quelle
4

Das gebräuchlichste Konstrukt, das ich bei der By-Line-Iteration einer Datei sehe, ist:

%Vor%

Um das obige mit einigen allgemeineren Ruby-Informationen zu erweitern, entspricht diese Syntax:

%Vor%

Als ich Ruby das erste Mal vorgestellt wurde, hatte ich keine Ahnung was | f | und | Zeile | Syntax gemeint. Ich wusste wann und wie es funktionierte, aber nicht, warum sie diese Syntax gewählt haben. Es ist meiner Meinung nach eines der magischen Dinge an Ruby. Diese einfache Syntax oben versteckt tatsächlich ein sehr fortgeschrittenes Programmierkonzept direkt vor der Nase. Der Code innerhalb des "do" / "end" oder {} wird als Block bezeichnet. Und Sie können es als anonyme Funktion oder Lambda betrachten. Das | f | und | Zeile | Die Syntax ist in der Tat nur das Handle zu dem Parameter, der vom ausführenden Elternteil an den Codeblock übergeben wird.

Im Falle von File.open () nimmt die anonyme Funktion ein einzelnes Argument, welches das Handle für das untergeordnete Datei-IO-Objekt ist.

Bei jeder Zeile handelt es sich um eine Interator-Funktion, die für jede Zeile einmal aufgerufen wird. Die | Zeile | ist einfach ein variables Handle für die Daten, die bei jeder Iteration der Funktion übergeben werden.

Oh, und eine nette Sache über do / end mit File.open ist, dass es die Datei am Ende automatisch schließt.

Bearbeiten:

Der Fehler, den Sie jetzt erhalten, legt nahe, dass der SSH-Aufruf das zusätzliche Leerzeichen (Newline) am Ende der Zeichenfolge nicht zu schätzen weiß. Um dies zu beheben, tun Sie einfach ein

%Vor%     
Matt 07.07.2010 20:12
quelle
1

Das Einlesen von Zeilen aus einer Datei ist eine übliche Operation, und Ruby hat eine einfache Möglichkeit, dies zu tun:

%Vor%

Die Methode readlines öffnet die Datei, liest die Datei in ein Array und schließt die Datei für Sie (Sie müssen sich also keine Gedanken darüber machen). Die Variable servers wird ein Array von Strings sein; Jede Zeichenfolge wird eine Zeile aus der Datei sein. Sie können die Methode Array::each verwenden, um dieses Array zu durchlaufen und den bereits vorhandenen Code zu verwenden. Versuchen Sie Folgendes:

%Vor%     
bta 07.07.2010 20:29
quelle
1

Ich denke, das ist es, was Sie für den Fehler in 'initialize': newline at the end of hostname (SocketError) wollen:

Net::SSH.start(line.chomp, 'andex')

Die each_line-Methode enthält das "\ n", und das chomp wird es entfernen.

    
Jesse Jashinsky 07.07.2010 20:47
quelle

Tags und Links