2013-02-13 185 views
3

我在ubuntu專用服務器上編輯/擴展我的防火牆bash腳本。如何在變量中使用變量?

下面的代碼只是一個摘錄。 下面的目的是爲一些IP重新路由/打開我的(http,ftp,telnet和ssh)端口用於/到3個盒子。

問題是我想在變量中使用變量。 因此--dport ${i}_${j}_port_ext被f.i正確替換。 --dport box0_http_port_ext,但不被視爲一個變量(當然)。其實,我想要的應該是--dport $box0_http_port_ext(介意$開頭)

我嘗試了幾件事f.i. --dport ${${i}_${j}_port_ext}--dport $(${i}_${j}_port_ext)但這並不好。

box0_http_port_ext="8080" 
box0_ftp_port_ext="21" 
box0_telnet_port_ext="23" 
box0_ssh_port_ext="22" 
# 
allow_box0_http_port_ip="1.2.3.4 99.98.97.96 55.56.57.58" 
allow_box0_ftp_port_ip="1.2.3.4 55.56.57.58" 
allow_box0_telnet_port_ip="55.56.57.58" 
allow_box0_ssh_port_ip="1.2.3.4" 
# 
for i in box0 box1 box2 
do 
    for j in http ftp telnet ssh 
    do 
    for ips in $allow_${i}_${j}_port_ip 
    do 
     $IPTABLES -t nat -A PREROUTING -p tcp -i $LAN_IFACE -s $ips --dport ${i}_${j}_port_ext -j DNAT --to-destination ${i}_ip:${i}_${j}_port_int 
    done 
    done 
done 

請不要看代碼,因爲它是一個摘錄,因此不完整。
的問題是:如何通過利用$ibox0$jHTTP代碼--dport $box0_http_port_ext。請記住$i也可以是box1/box2$j也可以用替換爲ftp/telnet/ssh

+0

@ni_hao請分享解決方案,一旦你得到它的修復。 – sundar 2013-02-13 07:44:24

回答

0

請儘量逃避_角色在劇本

--dport $i\_$j\_port\_ext 
2

試試這個:

varname=${i}_${j}_port_ext 
... --dport ${!varname} ... 

注意!裏面的${}

編輯:從@ user000001關於分隔i/j變量名稱的好處。

5

您可以使用間接變量參考做到這一點(見http://tldp.org/LDP/abs/html/bashver2.html#EX78

這是提供猛砸2版以上,使用前!變量名,${ }內。

name=${i}_${j}_port_ext 
echo ${!name} 

工作實施例:

#!/bin/bash 
i=box0 
j=http 

box0_http_port_ext="hello1" 
box2_telnet_port_ext="hello2" 

name=${i}_${j}_port_ext 
echo "varname: $name value: ${!name}" 

i="box2" 
j="telnet" 
name="${i}_${j}_port_ext" 
echo "varname: $name value: ${!name}" 

輸出

varname: box0_http_port_ext value: hello1 
varname: box2_telnet_port_ext value: hello2 

在上面的例子$name返回刺痛box0_http_port_ext,這是初始變量的名稱。這相當於$ {name}。 !運算符將字符串右側的值作爲變量名進行求值,並返回存儲在變量中的值。因此${!name}返回的值爲${box0_http_port_ext},即hello1

不幸的是bash不支持多維數組,但是這個技巧可以用來代替。

與其他答案的區別在於$i_$j_port_ext更改爲${i}_${j}_port_ext以便bash知道變量的名稱在哪裏結束。

0

謝謝你幫了我很多。

順便說一句,我沒有注意到f.i之間的區別。 $ name和{!name}。 $ name給出變量的名稱,其中變量的內容爲$ {!name}。這是唯一的解釋嗎?

關於(好)評論我的問題i.r.t.上面提到的摘錄,這對我有用:

for i in box0 box1 box2 
do 
    for j in http ftp telnet ssh 
    do 
    ALLOWED_IPS=allow_${i}_${j}_port_ip 
    for ips in ${!ALLOWED_IPS}; do 
    do 
     PORT_EXT=${i}_${j}_port_ext; PORT_INT=${i}_${j}_port_int; IP=${i}_ip 
     $IPTABLES -t nat -A PREROUTING -p tcp -i $LAN_IFACE -s $ips --dport ${!PORT_EXT} -j DNAT --to-destination ${!IP}:${!PORT_INT} 
    done 
    done 
done 
+0

閱讀我更新的問題答案。 – user000001 2013-02-13 13:05:55

相關問題