GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So übergeben Sie mehrere Argumente zur Ausführung mit dem .sh-Skript

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." :)


Linux
  1. Wie ändere ich die Erweiterung mehrerer Dateien?

  2. Befehlszeilenargumente an Bash-Skript übergeben?

  3. Wie bringt man Ls dazu, Verzeichnisse mit einem nachgestellten Schrägstrich aufzulisten?

  4. Skript mit Argumenten als Benutzer ausführen?

  5. Wie kann ich alle Argumente mit xargs mitten im Befehl in Linux übergeben

So schreiben Sie ein Bash-Skript mit Beispielen

So führen Sie einen Shell-Befehl mit Python aus

So listen Sie Dateisysteme in Linux mit lfs auf

Wie führe ich einen Befehl in einem Shell-Skript aus?

Wie übergebe ich Argumente an ein Skript, das vom Quellbefehl aufgerufen wird?

Wie führt man ein Bash-Skript aus?