
Ich möchte eine Datei mit Daten (mit dem Namen dates.txt) im folgenden Format durchlaufen:
2009 08 03 08 09
2009 08 03 09 10
2009 08 03 10 11
2009 08 03 11 12
2009 08 03 12 13
2009 08 03 13 14
Und übergeben Sie jedes Feld jeder Zeile als Positionsparameter an ein anderes Skript.
Das andere Skript wird ausgeführt, indem Folgendes in die Befehlszeile eingegeben wird:
$ . the_script 2009 08 03 08 09
Ich habe versuchtfor i in $(./dates.txt);do echo ${i};done
aber bekomme:
./dates: line 1: 2009: command not found
./dates: line 2: 2009: command not found
./dates: line 3: 2009: command not found
./dates: line 4: 2009: command not found
./dates: line 5: 2009: command not found
./dates: line 6: 2009: command not found
Daraus erkenne ich, dass es jede Zeile durcharbeitet, aber vielleicht bei jedem Feld hängen bleibt?
Aufgrund des oben Gesagten konnte ich noch nicht herausfinden, wie ich die gelesenen Zeilen als Positionsparameter an das andere Skript übergeben kann. Ich bin mir auch nicht sicher, wo ich es einfügen soll? Helfen Sie mir bitte!
Antwort1
Vielleicht meinen Sie so etwas?
while read -d $'\n' i; do echo $i;done <./dates
while read -d $'\n' i; do . the_script $i;done <./dates
Antwort2
Wenn Sourcing ( .
) nicht erforderlich ist, klingt dies nach einem Job fürxargs
:
xargs -a dates.txt -rL1 the_script
xargs
liest eine Eingabezeile und verwendet sie dann für Argumente für den angegebenen Befehl. Das standardmäßige Zeilentrennzeichen ist die neue Zeile.- Wir können Daten von anderen Befehlen dorthin weiterleiten oder mit eine Eingabedatei angeben
-a
. - Da pro Aufruf des Skripts genau eine Zeile verwendet werden soll, geben wir die Optionen
-r
(Nicht ausführen, wenn die Zeile leer ist) und-L
(Höchstmöglich N Zeilen pro Aufruf verwenden) an.
Antwort3
Verwenden Sie cat
in Ihrem Befehl und stellen Sie sicher, dass Sie den richtigen Pfad zum Dateinamen verwenden, wenn sich die Skripte nicht im selben Verzeichnis befinden. Wenn die Liste vorhanden ist, dates.txt
verwenden Sie $(cat ./dates.txt)
.Tippfehler hier korrigiert. Fügen Sie die .txt-Datei ein
Hier ist ein Beispiel:
Eine Liste von Daten mit dem Namen dates.txt
.
2009 08 03 08 09
2009 08 03 09 10
2009 08 03 10 11
2009 08 03 11 12
2009 08 03 12 13
2009 08 03 13 14
Ein Skript mit dem Namen, lstdates.sh
das die Planeten in dieser Liste wiedergibt.Herausgegeben
Dies läuft in einer Unterschale, in der der interne Feldtrenner (IFS)1wird außerhalb der Unterschale nicht geändert2.
#!/bin/bash
# Listing each date as an argument for `the_script`.
# Parenthesis runs in a subshell
(
# IFS line break
IFS=$'\012'
for dates in $(cat ./dates.txt)
do
echo $(./the_script $dates)
done
)
Standardmäßig erkennt IFS jedes Leerzeichen als Ende eines Felds. IFS=$'\012'
erkennt jede neue Zeile als Ende eines Felds. Wenn jede Zeile in doppelte Anführungszeichen wie eingeschlossen ist "2009 08 03 08 09"
, funktioniert das Standard-IFS.
the_script
enthält nur folgendes.
#!/bin/bash
echo $1
Referenz:Fortgeschrittenes Bash-Scripting-Handbuch, Kapitel 11. Schleifen und Verzweigungen