Die einfachste Methode zum Lesen von Argumenten kann wie folgt beschrieben werden:
Jedes Argument wird von $IFS
referenziert und analysiert oder aktuell definiert internal file separator
. Das Standardzeichen ist ein Leerzeichen.
Nehmen Sie zum Beispiel Folgendes; # ./script.sh arg1 arg2
Die Argumentliste in diesem Beispiel ist arg1 = $1
und arg2 = $2
die als arg1 arg2 = [email protected]
umgeschrieben werden kann .
Ein weiterer Hinweis ist die Verwendung einer Liste von Protokollen, wie oft ändert sich das? Meine Annahme ist täglich. Warum nicht die Verzeichnisausgabe als Array Ihrer iterativen Schleife verwenden? Zum Beispiel;
for i in $(ls /path/to/logs); do
./workaround.sh $i;
done
Oder noch besser, fahren Sie mit der Verwendung von functions
fort in Bash, um Unordnung zu beseitigen.
function process_file()
{
# transfer file code/command
}
function iterate_dir()
{
local -a dir=($(ls $1))
for file in ${dir[@]}; do
process_file $file
done
}
iterate_dir /path/to/log/for
Während dies lediglich Vorschläge sind, um Ihr Shell-Skripting-Wissen zu verbessern, muss ich wissen, ob Sie einen Fehler erhalten, und ich müsste auch die Details des Codes und / oder der Funktionalität jedes Skripts kennen. Verwendung des -x
Argument hilft auch beim Debuggen von Skripten.
Wenn Sie einfach Protokolle übertragen, möchten Sie vielleicht die Skripte komplett abschaffen und rsync
verwenden , rsyslog
oder syslog
da sie alle viel besser für die betreffende Aufgabe geeignet sind.
xargs -n 1 ./script.sh <list.txt
In diesem Beispiel xargs
führt ./script.sh
aus mehrmals mit einem einzigen Argument, das von seiner Standardeingabe gelesen wird.
Die Standardeingabe stammt aus der Datei list.txt
über eine einfache Shell-Eingabeumleitung. Dies setzt voraus, dass die list.txt
Datei enthält ein Argument, das mit dem Skript pro Zeile verwendet werden soll.
Die ./script.sh
Skript wird einmal für jede Zeile in list.txt
ausgeführt Datei.
Über die -n
Flag auf xargs
-n number
Rufen Sie das Dienstprogramm auf so viele Standardeingabeargumente wie möglich verwenden, bis zu number
(eine positive Dezimalzahl) argumentsmaximum.
Eine andere Lösung wäre, dem Skript zu erlauben, direkt von list.txt
zu lesen , oder um mehrere Befehlszeilenargumente zu verwenden (die Einträge aus list.txt
) und die Dateien in einem oder mehreren Stapeln herunterzuladen. Aber da wir die Mechanik des Skripts nicht kennen, kann ich keine detaillierte Erklärung dafür geben, wie das geht.
innerhalb des Skripts:Sie benötigen eine Leseschleife wie while read ; do ......... ; done < filename
um Zeilen als $REPLY-Variable zu behandeln...
zum Beispiel
while read
do
mv $REPLY $REPLY.old
done < liste.txt
benennt jeden Dateinamen innerhalb von liste.txt in filename.old um
Sie haben jetzt die Struktur, die Sie an Ihre Bedürfnisse anpassen können, je nachdem, was Sie mit " im Namen jeder auszuführenden Protokolldatei in list.txt meinen." :)