So durchlaufen Sie Variablen

So durchlaufen Sie Variablen

Ich habe einen Befehl in meinem CSH-Skript, der mindestens 2 Zeilen Ausgabe erzeugen kann, möglicherweise aber auch mehr. Ich wandle diese Zeilen in separate Variablen um, die ich dann an einen anderen Befehl übergeben möchte. Wie stelle ich meinen zweiten Befehl so ein, dass er eine Schleife durchläuft und für jede Variable ausgeführt wird, die von Befehl 1 ausgegeben wird? Unten sehen Sie, was ich habe, um die Ausgabe von Befehl 1 in Variablen umzuwandeln.

set vars = `echo "command 1"`

set numRows = $#vars  
if ($numRows < 2) then  
        echo "ERROR! $numRows rows!"  
        exit  
endif  


`echo '/command2 -L '$vars[1]'`

Antwort1

Beachten Sie, dass ich Bash und nicht CSH verwende, weil ich mich nicht hasse. Aber Sie können das alles auch in CSH machen, Sie müssen nur übersetzen. Wenn Sie stattdessen in Bash arbeiten möchten, führen Sie einfach zuerst „bash --login“ aus und dann arbeiten Sie in Bash.

Um die Art von Aufgabe zu erledigen, die Sie in einem Shell-Skript beschreiben, verwenden wir Pipes und keine Schleifen, wie Sie es in einer Programmiersprache tun würden. Verstehen Sie mich nicht falsch, esSindSchleifenstrukturen in CSH und Bash, aber für das, was Sie beschrieben haben, machen wir es anders.

Wenn ich einen Befehl hätte, der mehrere Ausgabezeilen erzeugt, und ich möchte, dass diese Zeilen nacheinander von einem anderen Befehl verarbeitet werden, würde ich die beiden Befehle mit einem Pipe-Zeichen | verbinden, etwa so:

cat datei.txt | grep "einige Wörter"

Der grep-Befehl verarbeitet jede Zeile, die von STDIN eingeht, das durch die Pipe mit STDOUT des cat-Befehls verknüpft ist. Dies ist ein triviales Beispiel, aber es funktioniert.

ein anderer:

echo 'eins,zwei,drei' | tr ',' '\n'

Dadurch werden alle Kommas durch Zeilenumbrüche ersetzt, sodass aus der einzeiligen Eingabe eine dreizeilige Ausgabe entsteht.

Wenn ich den Namen aller Dateien in einem Verzeichnis eine Erweiterung hinzufügen möchte, könnte ich etwa Folgendes tun:

cd directory
for filename in *
do
  mv ${filename} ${filename}.extension
done

Das * ist ein Datei-Globbing-Muster. Beim Datei-Globbing wird ein Muster in der Befehlszeile durch einen beliebigen Dateinamen im aktuellen Verzeichnis ersetzt, der dem Globbing-Muster entspricht. Das * bedeutet „irgendetwas“.

verwandte Informationen