2015-05-08 77 views
0

我有一個簡單的bash功能,它包括一個循環來捕獲的x次(在$ number_of_hosts定義)的主機名:擊:不評估變量正確

number_of_hosts="3" 

for i in $(seq 1 $number_of_hosts); do 
    read -ep "enter hostname" host$i 
done 

如果我單獨他們的工作回聲出每個可變。例如

echo $host1 
echo $host2 
echo $host3 

但是,如果我嘗試添加另一個for循環(用於後面的函數),我似乎無法得到它的工作。我正在使用

for i in $(seq 1 $number_of_hosts); do 
    echo $host$i 
done 

如何成功回顯之前由「讀取」所捕獲的值?

非常感謝您的幫助。

+0

你不能使用那樣的變量。你也可以在'number_of_hosts'聲明中使用'$'?你在第二位也只有一個'done',但我認爲這是故意的:) –

+0

是的,對不起,我遺留了一些我的代碼。更新爲刪除。你知道我可以如何正確使用該變量嗎?可能嗎? – cookandy

回答

1

有幾個骯髒的方式來使用「變量變量」,但我不會推薦他們。爲什麼不使用數組?

#!/bin/bash 

number_of_hosts=3 
for i in $(seq 1 "$number_of_hosts"); do 
    read -ep "enter hostname" 'host[i]' 
done 

echo "${host[1]}" 
echo "${host[2]}" 
echo "${host[3]}" 

如果你想避免調用seq,你也可以改變你的循環:

for ((i = 1; i <= number_of_hosts; ++i)); do 
    read -ep "enter hostname" 'host[i]' 
done 
+1

是的,這工作得很好,謝謝!我在下一個for循環中使用了變量'echo'$ {host [$ i]}「' – cookandy

+0

更進一步,有沒有辦法從另一個bash文件中讀取這些變量,這些變量的變量定義爲相同名稱... ie'host1 =「abc」host2 =「def」'...然後將其加載到顯示函數'for i in $(seq 1 $ number_of_hosts);做 \t echo -en「$ {host [$ i]}」done'可能嗎?我試圖在循環之前獲取文件,但它不起作用。 – cookandy

+0

我不完全確定你的意思,有幾個文件或只有一個?看起來這似乎正在成爲一個單獨的問題 - 而不是改變這個問題的範圍或污染評論,也許這是值得問一個新問題,所以你可以提供更多的細節。 –

0

我會做這種方式:

#!/bin/bash 

number_of_hosts="3" 

for i in $(seq 1 $number_of_hosts); do 
     read -e -p "enter hostname: " host[$i] 
done 

for item in ${host[@]}; do 
     echo $item 
done 

的一點是,host是在這種情況下的數組,完全符合您的需求。下一個重要的事情是變量number_of_hosts - 當你在Bash中聲明變量時,你只寫它的名字。美元符號只有在您想要獲得其價值時纔會被編寫。