2016-02-22 38 views
0

我正在編寫一個bash腳本來收集每個服務器的硬件信息。但在腳本的某一部分,我無法打印給定多次單一echo命令未能回顯「for循環」中的變量值

#!/bin/bash 
NO=$(df -hT | grep ext | wc -l) 
for i in $(seq 1 $NO);do export PART$i=$(df -hT | grep ext | head -$i | tail -1 | awk '{print $1}'); done 
echo "Total $NO ext partitions found" 
for i in $(seq 1 $NO);do echo "Ext Partition$i is ${PART$i} ";done 

在我的系統,我有兩個分機分區變量的值,所以變量$ NO將存儲值2 。

我期待和希望的輸出如下:

Total 2 ext partitions found 
Ext Partition1 is /dev/sda7 
Ext Partition2 is /dev/sda8 

,但我有預期麻煩印刷「我$第$」。現在我在最後一行出現「for循環」錯誤。

# /root/disk.sh 
Total 2 ext partitions found 
/root/disk.sh: line 5: Ext Partition$i is ${PART$i} : bad substitution 

你能告訴我如何正確調用並回顯最後for循環中的PART1和PART2的值嗎?

回答

2

您需要使用間接擴展:

v=PART$i 
echo "Ext Partition$i is ${!v}" 

從bash的手冊:(!)

如果parameter第一個字符是一個感嘆號,它引入了可變間接的級別。 Bash使用從parameter的其餘部分形成的變量的值作爲變量的名稱;這個變量然後被展開,並且該值被用於替換的其餘部分,而不是parameter本身的值。這被稱爲間接擴展。此例外是下面描述的${!prefix*}${!name[@]}的擴展。爲了引入間接性,感嘆號必須緊跟左括號。

+0

它的工作原理。但是,你能說出那個驚歎號的含義是什麼嗎?實際上>> $ {!v}是什麼意思? – Jondi

+0

我已經更新了我的答案。 –

+0

謝謝@rob_mayoff – Jondi

-1

您正嘗試調用兩個單獨變量$ {PART $ i}。嘗試:

echo "Ext Partition$i is ${PART}${i}" 
+0

是的,我已經試過一個了,但只會打印計數器i的值在每次迭代中像如下: # /root/disk.sh Total 2 ext partitions found Ext Partion1 is 1 Ext Partion2 is 2 Jondi

3

我會建議使用數組變量來代替:

#!/bin/bash 
NO=$(df -hT | grep ext | wc -l) 
declare -a PART 
for i in $(seq 1 $NO);do PART[$i]=$(df -hT | grep ext | head -$i | tail -1 | awk '{print $1}'); done 
echo "Total $NO ext partitions found" 
for i in $(seq 1 $NO);do echo "Ext Partion$i is ${PART[$i]} ";done 

你可以進一步簡化這個代碼:

PART=($(df -hT | awk '/ext/ { print $1 }')) 
NO=${#PART[@]} 
echo "Total $NO ext partitions found" 
for i in ${!PART[@]}; do echo "Ext Partion$i is ${PART[$i]} "; done 

注意,簡化並更改索引是基於0的索引。

+0

太感謝你了。第一個對我來說工作得很好。 對於第二個,最後一個for循環「for i in $ {!x [@]};做回聲」Ext Partion $ i $ {PART [$ i]}「;完成」在屏幕上什麼都不打印。 – Jondi

+0

@johnwilson哎呀忘了在第二個例子中將我的測試變量'x'更改回'PART'呵呵:)謝謝你讓我知道。 –

+0

啊現在看起來不錯,謝謝兄弟:) – Jondi