2 Stimmen

BASH, mehrere Arrays und eine Schleife

Bei der Arbeit haben wir 7 oder 8 Festplatten, die wir landesweit versenden, und jede hat einzigartige Etiketten, die nicht fortlaufend sind.

Idealerweise werden die Laufwerke in unseren Desktop eingesteckt, dann werden die Ordner vom Server abgerufen, die dem Laufwerksnamen entsprechen.

Manchmal wird nur eine Festplatte angeschlossen, manchmal mehrere, möglicherweise werden in Zukunft weitere hinzugefügt.


Jedes wird unter /Volumes/ und seiner Kennung gemountet, also zum Beispiel /Volumes/f00, wobei f00 die Kennung ist.

Ich möchte, dass die Datenträger gescannt werden, um zu sehen, ob eines der Laufwerke angeschlossen ist, dann wird der Server überprüft, um zu sehen, ob der Ordner existiert, und wenn ja, werden Ordner und rekursive Ordner kopiert.


Hier ist, was ich bis jetzt habe, es prüft, ob das Laufwerk in Volumes existiert:

#!/bin/sh

#Declare drives in the array

ARRAY=( foo bar long )

#Get the drives from the array
DRIVES=${#ARRAY[@]}

#Define base dir to check
BaseDir="/Volumes"

#Define shared server fold on local mount points
#I plan to use AFP eventually, but for the sake of ease
#using a local mount.
ServerMount="BigBlue"

#Define folder name for where files are to come from
Dispatch="File-Dispatch"

dir="$BaseDir/${ARRAY[${i}]}"

#Loop through each item in the array and check if exists on /Volumes
for (( i=0;i<$DRIVES;i++));
do
  dir="$BaseDir/${ARRAY[${i}]}"
    if [ -d "$dir"  ]; then
    echo "$dir exists, you win."
  else
    echo "$dir is not attached."
    fi
done

Was ich nicht herausfinden kann, ist, wie ich die Volumes für den Server überprüfen kann, während ich eine Schleife durch die Festplatteneinhängepunkte durchlaufe.

Ich könnte also etwas tun wie:

#!/bin/sh

#Declare drives, and folder location in arrays

ARRAY=( foo bar long )

#Get the drives from the array

DRIVES=${#ARRAY[@]}

#Define base dir to check
BaseDir="/Volumes"

#Define shared server fold on local mount points

ServerMount="BigBlue

#Define folder name for where files are to come from
Dispatch="File-Dispatch"

dir="$BaseDir/${ARRAY[${i}]}"

#List the contents from server directory into array

ARRAY1=($(ls ""$BaseDir"/"$ServerMount"/"$Dispatch""))
SERVERFOLDER=${#ARRAY1[@]}

echo ${list[@]}

for (( i=0;i<$DRIVES;i++)); (( i=0;i<$SERVERFOLDER;i++)); 
do
  dir="$BaseDir/${ARRAY[${i}]}"
  ser="${ARRAY1[${i}]}"
    if [ "$dir" =~ "$sir" ]; then
    cp "$sir" "$dir"
  else
    echo "$dir is not attached."
    fi
done

Ich weiß, das ist ziemlich falsch... sehr falsch, aber ich hoffe, es gibt Ihnen eine Vorstellung davon, was ich zu erreichen versuche.

Irgendwelche Ideen oder Vorschläge?

1voto

Kilian Foth Punkte 13440

Sie scheinen verwirrt zu sein über verschachtelte for Schleifen, ganz unabhängig von Arrays. Der erste Trick besteht darin, nicht dieselbe Indexvariable für beide Schleifen zu verwenden, und der zweite besteht darin, die Schlüsselwörter und die Aufzählungen richtig zu verschachteln, etwa so:

for x in a b c; do
  for y in 1 2 3; do
    echo $x$y
  done
done

Dies wird gedruckt:

a1
a2
a3
b1
b2
b3
c1
c2
c3

1voto

Dennis Williamson Punkte 322329

Einige Anmerkungen:

  • Sie verwenden Variablen, bevor Sie sie definieren (ich sehe, dass Sie diese Variable ein zweites Mal an einer geeigneteren Stelle gesetzt haben), und die Anführungszeichen sind unnötig:
    ARRAY1=($(ls "$BaseDir/$ServerMount/$Dispatch"))

  • Fehlendes Schlusswort:
    ServerMount="BigBlue"

  • Die Verwendung von geschweiften Klammern, wenn sie nicht notwendig sind, erschwert die Lesbarkeit (Sie könnten auch das Dollarzeichen für Array-Subscripts weglassen):
    dir="$BaseDir/${ARRAY[i]}"

  • Dieses Feld ist nicht definiert:
    echo ${list[@]}

  • Hm? Ich glaube, Sie wollen verschachtelte for-Schleifen, und Sie müssen verschiedene Variablen verwenden. Anstelle von:
    for (( i=0;i<$DRIVES;i++)); (( i=0;i<$SERVERFOLDER;i++));
    versuchen:

    for (( i= ... do
    for (( j= ...
    do dir="$BaseDir/${ARRAY[i]}" ser="${ARRAY1[j]}"

  • Sie sollten sich bewusst sein, dass die Iteration über ein Array fehlschlägt, wenn die Datei- oder Verzeichnisnamen Leerzeichen enthalten. Die Alternative ist, die Pipe find in eine while...read Schleife.

  • Hier nennt man es "ser" und dann "sir":
    ser="${ARRAY1[i]}"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X