2010-04-30 2 views
2

На работе у нас есть 7 или 8 жестких дисков, которые мы отправляем по стране, каждая из которых имеет уникальные метки, которые не являются последовательными.BASH, множественные массивы и петля

Идеальные диски подключены к нашему компьютеру, а затем получают папки с сервера, соответствующие имени накопителя.

Иногда только один жесткий диск подключается, иногда кратно, возможно, в будущем будет добавлено больше.


Каждый монтируется в/Тома/и его идентификатор; например,/Volumes/f00, где f00 - идентификатор.

Что я хочу сказать, сканирует тома, если какие-либо диски подключены к сети, а затем проверьте сервер на наличие папки, если она копирует папку и рекурсивные папки.


Вот то, что я до сих пор, он проверяет, является ли диск существует в томах:

#!/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 

То, что я не могу понять, как сделать, как проверить томов для сервера при прохождении через точки крепления жесткого диска.

Так что я мог бы сделать что-то вроде:

#!/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 

Я знаю, что это очень неправильно ... ну очень, но я надеюсь, что это дает вам представление о том, что я пытаюсь достичь.

Любые идеи или предложения?

ответ

1

Некоторых примечания :

  • вы используете переменные, прежде чем определить их (я вижу, что вы установите эту переменную во второй раз в более подходящем месте), и эти цитаты не нужны:
    ARRAY1=($(ls "$BaseDir/$ServerMount/$Dispatch"))
  • Отсутствует закрытие цитата:
    ServerMount="BigBlue"
  • Используя фигурные скобки, когда они не обязательно препятствует читаемости (можно также опустить знак доллара для индексов массива):
    dir="$BaseDir/${ARRAY[i]}"
  • Этот массив не является не определено:
    echo ${list[@]}
  • Да? Я думаю, вы можете захотеть вложенных циклов, и вам придется использовать разные переменные.Вместо того, чтобы:
    for ((i=0;i<$DRIVES;i++)); ((i=0;i<$SERVERFOLDER;i++));
    попробовать:
 for ((i= ... 
    do 
     for ((j= ... 
     do 
      dir="$BaseDir/${ARRAY[i]}" 
      ser="${ARRAY1[j]}"
  • Вы должны знать, что если имена файлов или имена каталогов имеют пробелы в них, итерация массива потерпит неудачу. Альтернативой является труба find в петлю while...read.
  • Здесь вы называете это «сер», а затем вы называете его «сэр»:
    ser="${ARRAY1[i]}"
+0

Извините, половина этих ошибок пришла от меня, когда я ленился, когда копировал здесь и редактировал, но спасибо, я тоже попробую это. Я знал для ((i = 0; i <$ DRIVES; i ++)); ((i = 0; i <$ SERVERFOLDER; i ++)); это неправильно, но это то, что я хотел сделать. Вы помогаете с некоторыми из моих вопросов за последний месяц. – S1syphus

1

Вы, кажется, смущены о вложенных петлях for, совершенно независимых от массивов. Первый фокус в том, чтобы не использовать тот же переменный индекс для обоего петель, а второй является чередовать ключевые слова и перечисления должным образом, как это:

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

Печатается:

a1 
a2 
a3 
b1 
b2 
b3 
c1 
c2 
c3 
+0

Would http://pastebin.com/F0RPrbAW быть более подходящим, то, извините, не очень сделал это раньше. – S1syphus

+0

Ну, похоже, это сработало, просто сопоставляя переменные с этой проблемой, но я уверен, что Google будет сортировать этот. – S1syphus

+0

@ S1syphus: Что касается вашего кода pastebin, вы должны использовать разные переменные для двух циклов (и двух индексов массива). –

Смежные вопросы