2015/03/18

bash 用變數內容當變數名稱取值

在很多情況下我們會遇到無法預知個數的變數群,而且變數名稱最後是採用數字來當作區別,因為是未知個數,所以要使用一個動態迴圈來處理,如何取得個別數值來處理變得很重要。參考下面的範例:
DNS1="8.8.8.8"
DNS2="8.8.4.4"
DNS3="0.0.0.0"
DNS4="139.175.150.20"
DNS5="168.95.1.1"
DNS_CNT=5
RESOLV_CONF="/etc/resolv.conf"
i=1
echo "; generated by my script" > $RESOLV_CONF
while [ $i -le $DNS_CNT ]
do
    eval "DNS_ADDR=\$DNS$i"
    if [ "0.0.0.0" != "$DNS_ADDR" ]; then
        echo "nameserver $DNS_ADDR" >> $RESOLV_CONF
    fi
done

最主要看 do 迴圈的第一行,eval "DNS_ADDR=\$DNS$i" ,因為 eval 會去執行它後面帶出來的那一行,而 \$ 會是 $ 符號,$i 則是目前 i 的值,因此當 i=1 時 "DNS_ADDR=\$DNS$i" 就會是 DNS_ADDR=$DNS1,透過 eval 執行,就會把 DNS1 的值帶給 DNS_ADDR 以利後面處理。

沒有留言: