2014-07-22 47 views
0

這種情況下,我有未知數量的卷組及其名稱分配有未知數量的磁盤。 例子:bash將結果查詢分配給變量

pvs -o pv_name,vg_name 
    PV   VG 
    /dev/vdd appvg01 
    /dev/vdb appvg01 
    /dev/vdf3 vg00 
    /dev/vdh testvg 

vgs --noheadings | awk '{print $1}'| while read line ; do echo $line;vgs --noheadings -o pv_name $line; done 
appvg01 
    /dev/vdd 
    /dev/vdb 
testvg 
    /dev/vdh 
vg00 
    /dev/vdf3 

在最後階段,我想反映與新盤的每個卷,我將手動添加:

for i in `/sbin/lvs| /bin/awk '{if ($2 ~ /appvg01/) print $1}'`; do 
    /sbin/lvconvert -b -m0 appvg01/$i /dev/vde 
done 

,但是,我不知道什麼卷名應我關聯,因爲它可能是任何其他名稱。 什麼是這種結構的最佳途徑。

感謝

+1

僅供參考 - 請參閱http://mywiki.wooledge.org/DontReadLinesWithFor –

+1

......不過,我真的不明白這個問題。 「關聯」是什麼意思?你爲什麼需要知道一個名字?等等 –

回答

2

正確的數據結構來存儲這種在bash信息關聯數組:

declare -A pvs 
{ 
    read # skip the header 
    while read -r pv vg; do 
    pvs[$pv]=$vg 
    done 
} < <(pvs -o pv_name,vg_name) 

此後,你可以重複做查找:

for pv in "${!pvs[@]}"; do 
    vg="${pvs[$pv]}" 
    echo "vg $vg is backed by pv $pv" 
done 
+0

嗨,查爾斯,謝謝你的快速回應。對不起,如果我不夠清楚。我需要知道卷的名稱,以便能夠在我鏡像時使用該名稱。在該過程結束時,我必須取消鏡像鏡像卷,並且我需要再次知道該名稱:因爲我在'/ sbin/lvs |/bin/awk'{if($ 2〜/ appvg01 /)print $ 1}'';/bin/nice -n 19/usr/bin/ionice -c 3/sbin/lvconvert -b -m1 --corelog appvg01/$ i $ NewDisks;在/ sbin/lvs |中爲我完成/ bin/awk'{if($ 2〜/ appvg01 /)print $ 1}''; do/sbin/lvconvert -b -m0 appvg01/$ i $ OldDisks;完成 – user1607856

+1

...好吧,我已經向您展示瞭如何執行關聯數組查找;把你想要的東西存儲在一個關聯數組中(用其他語言,這可能被稱爲映射或hashmap),然後回到這個名字應該是一個簡單的練習。 –

+1

@ user1607856,...如果你想得到比這更好的答案,那麼很容易判斷答案是否正確的問題將得到更少的handwavey答覆。請參閱http://sscce.org/或http://stackoverflow.com/help/mcve - 構建不需要LVM的再現器,並且在此處幫助您更容易。 –

相關問題