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.
InformationsquelleAutor nicorellius | 2011-12-11
Schreibe einen Kommentar