bash – 如何在变量中使用变量?
我在ubuntu专用服务器上编辑/扩展我的防火墙bash脚本.
下面的代码只是一个摘录. 问题是我想在变量中使用变量. 我尝试了几件事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 请不要查看代码,因为它是摘录,因此不完整. 解决方法
您可以使用间接变量参考来实现(参见
http://tldp.org/LDP/abs/html/bashver2.html#EX78)
这在Bash Version 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返回sting box0_http_port_ext,它是初始变量的名称.这相当于${name}.的! operator将字符串作为变量名称计算在其右侧,并返回存储在变量中的值.所以${!name}返回${box0_http_port_ext}的值,即hello1. 不幸的是,bash不支持多维数组,但可以使用这个技巧. 与其他答案的区别在于$i_ $j_port_ext更改为${i} _ ${j} _port_ext,以便bash知道变量名称的结束位置. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- AngularJS-在路由到其他控制器之前提示用户以保存更改
- unix – 是否可以在openssl的s_client命令上设置超时?
- angularjs – Karma中JASMINE_ADAPTER和ANGULAR_SCENARIO_A
- angularjs – 如何注释ngdoc作为角部件?
- Angular2 – 具有相同路线的两个组件
- Bootstrap模态框水平垂直居中与增加拖拽功能
- 远程通讯组件Hprose开发文档
- AF_UNIX域 – 为什么只使用本地文件名?
- twitter-bootstrap – Knockout Twitter Bootstrap Popover
- angularjs – 当单击表单上的按钮时,在角度然后打开窗口中动