我试图在我的WireGuard路由器上自动化OpenWrt,但是在创建配置文件时,我遇到了一些嵌套变量的问题。下面是我设置的变量:
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 < "/etc/wireguard/peer.conf"
Endpoint = ${DDNS}:${WG_${LAN}_server_port}
EOF不幸的是,我得到了-ash:语法错误:糟糕的替换
如何调用也包含变量的变量?我需要展开$LAN变量,同时展开$WG_guest_server_port,后者也依赖于第一个$LAN变量。
注:灰是一种轻版的Bash,通常带有Busybox。我正在为OpenWrt社区Wiki编写一个脚本,所以OpenWrt的所有版本都包含了ash (Busybox)。
发布于 2021-04-18 22:40:01
${WG_${LAN}_server_port}在我知道的任何外壳中都不起作用。在Ksh、Bash或Zsh中,您有间接引用的方法,即引用另一个变量中的变量。
但是您说的是OpenWrt和ash,所以您可能只具有POSIX的基本特性。
在这种情况下,您可能需要回到eval,尽管它是丑陋的。
您可以这样做,首先间接地将WG_guest_server_port的内容加载到另一个变量,然后在here-doc中使用它:
eval "serverport=\${WG_${LAN}_server_port}"
cat < "/etc/wireguard/peer.conf"
Endpoint = ${DDNS}:${serverport}
EOF请注意,这意味着内容${LAN}成为代码行的一部分。恶意用户可能会形成一个特殊值,从而导致脚本运行任意命令。因此,如果$LAN包含不受信任的数据,请不要这样做。
https://unix.stackexchange.com/questions/645706
复制相似问题