2010-04-30 117 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循環,你必須使用不同的變量。相反的:
    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」,然後你把它稱爲「先生」:
    ser="${ARRAY1[i]}"
+0

對不起,這些錯誤中的一半來自於我懶惰複製到這裏和編輯時,但謝謝我也會試試這個。我知道((i = 0; i <$ DRIVES; i ++)); ((i = 0; i <$ SERVERFOLDER; i ++));是不正確的,但這是我想要的。 你在上個月幫我解決了一些問題,我非常感謝。 – S1syphus 2010-04-30 15:21:45

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

將 http://pastebin.com/F0RPrbAW 更合適的話,對不起,還沒有真正之前做過。 – S1syphus 2010-04-30 15:17:14

+0

那麼這似乎工作,只是匹配變量多數民衆贊成在這個問題上,但我相信谷歌會排序一個。 – S1syphus 2010-04-30 15:19:47

+0

@ S1syphus:關於你的pastebin代碼,你必須爲兩個循環(和兩個數組索引)使用不同的變量。 – 2010-04-30 15:42:27