Bash-Script - Ausführen von Funktionen mit Variablen in der Schleife
Habe ich eine Freigabe backup bash-script, das funktioniert, wie es ist, aber es verwendet mehrere Zeilen etwas zu tun, das geschleift werden kann (hoffe ich). Ich denke, es kann viel besser sein, und der erste Schritt, meiner Meinung nach, wäre die Verwendung einer Schleife über die Aktien.
In es scurrent Zustand, das Skript habe ich drei Anrufe von bash-Funktionen und ein python-script (das sendet eine E-Mail mit stderr und stdout) für jede Aktie, von denen es mehrere (4 jetzt, und vielleicht bis zu 6-8), und es sieht wie folgt aus:
create_log_dir "$share1_backup"
create_log "$share1_backup" "$log_file"
create_rsync_cmd "$log_file"
python backup.py $email_address \
"$rsync_command $rsync_args $share1 $share1_backup"
So, dass der code oben wäre so etwas wie 20-30 Zeilen für alle Aktien. Ich hatte gehofft, um eine Schleife, die durchläuft diese Schritte für jede Aktie, die so aussieht (pseudocode-wie Beispiel):
for var in list (each $share_var and $log_var)
do
create_log_dir "$share_var"
create_log "$share_var" "$log_var"
create_rsync_cmd "$log_var"
done
Habe ich versucht, dieses format mit einigen bash-Optionen und konnte es nicht bekommen, um zu arbeiten. Noch neu in bash, also ich bin in der Hoffnung zu Holen einige Coole Tipps mit dieser.
Vielen Dank im Voraus.
UPDATE BEARBEITEN
Hier sind der Pfad und Protokoll-Variablen und die for-Schleife, die ich verwende:
#variables
share1="/path/to/share/"
share1_backup="/path/to/share/backup"
# log creation
# If the 'rsync_logs' directory in destination doesn't exist, create it.
create_log_dir()
{
backup_dest=$1
if [ ! -d "$backup_dest/rsync_logs" ]
then
mkdir $backup_dest/rsync_logs
fi
}
# Check for log_file existence; append '_alt' if exists.
create_log()
{
backup_dest=$1
log_file=$2
log_file="$backup_dest/rsync_logs/$(date +"%Y-%m%d")_rsync_output.log"
if [ -f $log_file ]
then
log_file="${log_file}_alt"
fi
}
#loop
for pair in "share1_backup log_file"
do
set -- $pair
share=$1
log=$2
create_log_dir "$share"
create_log "$share" "$log"
create_rsync_cmd "$log"
done
Also versuchte ich es mit der original-Antwort:
for pair in "share1_backup log_file"
und... mit dem Variablen-Methode (weder schien zu funktionieren - zuerst einen Fehler gab, weil das Verzeichnis, share1_backup/rsync_logs
nicht existiert - es hat nicht die variable benutzen):
for pair in "${share1_backup} ${log_file}"
Diese zweite führte in eine leere log Datei.
UPDATE EDIT 2
Ich denke der bessere Ansatz an, so dass die beiden Antworten werden beide arbeiten, ist das erstellen der logs woanders. Ich ursprünglich dachte, es wäre schön, Sie zu retten, in das backup-Ziel, aber dann wieder, es könnte gut sein, zum speichern des logs auf der Maschine, auf der Sie alle Freigaben gemountet sind, für die Konsistenz. Dann kann ich ein Skript schreiben, dass die Kopien, die Sie über in regelmäßigen Abständen, wenn es sein muss, haben Sie auf dem Ziellaufwerk. Ich habe auf diese Weise bauen die variable log_file vor der Zeit, und verwenden Sie dann in der Schleife, als David K. Hess hingewiesen.
Nochmals vielen Dank.
- was verwenden Sie als
list
? - Naja, die Liste wäre meine Liste der Aktien, und die log-variable. Aber es muss nicht eine Liste, denke ich. Nicht wirklich sicher, ob dies der beste Weg oder nicht???
- In Ihrem neuesten Skript, im ersten Fall mit der Literale, es geht um diese exakte Werte, die als Argumente an Funktionen (das ist nicht das, was ich denke, Sie wollen). Im zweiten Fall, Sie sind nicht initialisieren "log_file" variable vor der Schleife ausgeführt wird.
- Yah, ich sehe, was du meinst... auf dieser Grundlage, es scheint, dass diese Idee funktioniert nicht, nachdem alle, oder zumindest nicht so wie ich es vorgestellt. Ich glaube, ich muss mal mit ein paar anderen Ideen. Vielen Dank für Ihre Hilfe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser Ansatz sollte funktionieren, solange sich Ihre Wege nicht Räumen:
run_functions "$share_name" "$log_name"
.$share_name
wäre arg 1 und$log_name
arg-2. Würde diese noch funktionieren? Ich bin nicht vertraut mit dem paar-Konzept, obwohl es scheint gerade nach vorne.subprocess
- Modul und führen Sie einfach Ihre Befehle aus Python.for pair in "share1_var log1_var"
scheint, wie es funktionieren sollte... ich brauche es zu benutzen Variablen, die deklariert wurden oben als Pfade. Also versuchte ichfor pair in "${share1} ${log1_var}"
und meine log-Datei endet leer.Was ist ein array? Es funktioniert auch, wenn die Werte Leerzeichen enthalten.