bash - 如何在变量中使用变量?

标签 bash shell variables ubuntu

我正在 ubuntu 专用服务器上编辑/扩展我的防火墙 bash 脚本。

下面的代码只是一个摘录。 下面的目的是为 3 个盒子重新路由/打开我的(http、ftp、telnet 和 ssh)端口的某些 IP。

问题是我想在变量中使用变量。 所以 --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

请不要看代码,因为它是摘录,因此并不完整。
问题是:如何通过对 box0$j 使用 $i 来编码 --dport $box0_http_port_ext > 对于 http。请记住,$i 也可以是 box1/box2 并且 $j 也可以替换为 ftp/telnet/ssh.

最佳答案

您可以使用间接变量引用(参见 http://tldp.org/LDP/abs/html/bashver2.html#EX78)

这在 Bash 版本 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 知道在哪里变量名结束。

关于bash - 如何在变量中使用变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14848384/

相关文章:

html - 在 HTML 中使用变量作为类

linux - 想在第二个尾部斜杠之前剪切吗?

bash - 如何使用 args 和 echo 命令在 sed 命令中转义双引号?

shell - 无法在 MinGW/msys shell 或终端中键入 'e' 或 'P'

java - java变量可以是无界通配符吗?

php - 如何获取静态类中包含文件中的变量

linux - 使用 sed 从管道中删除空行

image - 如何制作 Bash 脚本来查找项目中未使用的图像?

linux - 删除目录结构,但保留目录内容

unix - 如何使用find命令从列表中查找所有带扩展名的文件?