2011-07-30 114 views
1

我有一個循環創建了一組變量,如DISK1,DISK2 ...其中變量名稱末尾的數字由循環創建,然後加載了一個設備名稱的路徑。現在我想在另一個循環中使用這些變量來執行shell命令,但該變量不會將其內容提供給shell命令。Bash腳本使用Bash變量作爲參數執行shell命令

for ((counter=1 ; counter<=devcount ; counter++)) 
do 
    TEMP="\$DISK$counter" 

# $TEMP should hold the variable name of the disk, which holds the device name 
# TEMP was only for testing, but still has same problem as $DISK$counter 

    eval echo $TEMP #This echos correctly 

    STATD$counter=$(eval "smartctl -H -l error \$DISK$counter" | grep -v "5.41" | grep -v "Joe") 
    eval echo \$STATD$counter 

done 
+0

預期輸出?實際產出? –

+0

輸出是無關緊要的,因爲這個問題是關於功能 – sdproto

回答

2

有史以來不要使用eval,除非可能沒有其他方法,並且您真的知道您在做什麼。

STATD$counter=$(...)應該給出錯誤。這不是有效的賦值,因爲字符串「STATD$counter」不是有效的變量名稱。會發生什麼事情(使用一個具體的例子,如果計數器碰巧是3並且你的管道在輸出「輸出」,那麼bash將只擴展該行直到「STATD3=output」,所以它將試圖找到名爲「STATD3=output」的命令「並運行它可能性不是你想要的

聽起來你想做的所有事情都可以用數組來完成如果你不熟悉bash數組請看Greg's Wiki特別是this page或bash手冊頁,以瞭解如何使用它們。

例如,在循環中,您沒有發佈您的問題:make disk(不是DISKdon't use all upper case variable names),像這樣

disk+=("new value") 

甚至

disk[counter]="new value" 
在你的問題中環

然後,你可以讓statd陣列以及與從磁盤值由

statd[counter]="... ${disk[counter]} ..." 
分配一個數組

值得再說一次:避免使用eval

+0

如果你想basterdize像做一個2維數組的東西evals是偉大的;-) – nhed

+0

感謝您的答案。我只是將其全部轉換爲數組,並解決了整個問題。至於STATD $計數器,它甚至沒有關係,因爲它在試圖執行shell命令時未能評估$ DISK $計數器(吐出內容),所以它永遠不會分配任何東西到'basterdized'STATD $計數器變量。 :-)所以即使你沒有完全回答爲什麼$ DISK $計數器不會擴大,你就會以我應該開始的方向撞到我。謝謝! – sdproto

+0

@sdproto:你確定它是失敗的'\ $ DISK $ counter'部分嗎?這部分應該正確擴展,並且您的評論/測試在回覆之前似乎證實了這一點。 – jw013