2013-02-13 246 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