![相互依赖的嵌套变量](https://linux22.com/image/14850/%E7%9B%B8%E4%BA%92%E4%BE%9D%E8%B5%96%E7%9A%84%E5%B5%8C%E5%A5%97%E5%8F%98%E9%87%8F.png)
我正在尝试在 OpenWrt 路由器上自动化 WireGuard,但在创建配置文件时遇到了一些嵌套变量问题。以下是我设置的变量:
export LAN="guest"
export interface="10.0.5"
export DDNS="my-ddns.no-ip.com"
export WG_${LAN}_server_port="51820"
export WG_${LAN}_server_IP="10.0.5.1/24"
export WG_${LAN}_server_firewall_zone="${LAN}"
最后三个变量扩展为:
export WG_guest_server_port="51820"
export WG_guest_server_IP="10.0.5.1/24"
export WG_guest_server_firewall_zone="guest"
在conf文件中我试图定义终点通过扩展变量来参数
cat <<EOF > "/etc/wireguard/peer.conf"
Endpoint = ${DDNS}:${WG_${LAN}_server_port}
EOF
不幸的是我得到了-ash:语法错误:错误替换
如何调用一个也包含一个变量的变量?我需要扩展 $LAN 变量,同时扩展 $WG_guest_server_port,它也依赖于第一个 $LAN 变量。
NB Ash 是 Bash 的轻型版本,通常随 Busybox 一起提供。我正在为 OpenWrt 社区 Wiki 编写一个脚本,因此 ash (Busybox) 包含在所有版本的 OpenWrt 中。
答案1
${WG_${LAN}_server_port}
在我知道的任何 shell 中都不起作用。在 Ksh、Bash 或 Zsh 中,您可以采取间接引用的方式,即引用在另一个变量中命名的变量。
但你说的是 OpenWrt 和 ash,所以你可能只有裸露的 POSIX 功能。
在这种情况下,您可能需要退回到eval
,尽管它很丑陋。
您可以执行类似的操作,首先将 的内容WG_guest_server_port
间接加载到另一个变量,然后在此处文档中使用它:
eval "serverport=\${WG_${LAN}_server_port}"
cat <<EOF > "/etc/wireguard/peer.conf"
Endpoint = ${DDNS}:${serverport}
EOF
请注意,这意味着内容${LAN}
成为一行的一部分代码。恶意用户可能会形成一个特殊值,导致脚本运行任意命令。因此,如果$LAN
包含不受信任的数据,请不要这样做。