首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相互依赖的嵌套变量

问相互依赖的嵌套变量
EN

Unix & Linux用户
提问于 2021-04-18 21:51:59
回答 1查看 352关注 0票数 0

我试图在我的WireGuard路由器上自动化OpenWrt,但是在创建配置文件时,我遇到了一些嵌套变量的问题。下面是我设置的变量:

代码语言:javascript
复制
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}"

最后三个变量扩展为:

代码语言:javascript
复制
export WG_guest_server_port="51820"
export WG_guest_server_IP="10.0.5.1/24"
export WG_guest_server_firewall_zone="guest"

在conf文件中,我试图通过展开变量来定义端点参数

代码语言:javascript
复制
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)。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2021-04-18 22:40:01

${WG_${LAN}_server_port}在我知道的任何外壳中都不起作用。在Ksh、Bash或Zsh中,您有间接引用的方法,即引用另一个变量中的变量。

但是您说的是OpenWrt和ash,所以您可能只具有POSIX的基本特性。

在这种情况下,您可能需要回到eval,尽管它是丑陋的。

您可以这样做,首先间接地将WG_guest_server_port的内容加载到另一个变量,然后在here-doc中使用它:

代码语言:javascript
复制
eval "serverport=\${WG_${LAN}_server_port}"
cat < "/etc/wireguard/peer.conf"
Endpoint = ${DDNS}:${serverport}
EOF

请注意,这意味着内容${LAN}成为代码行的一部分。恶意用户可能会形成一个特殊值,从而导致脚本运行任意命令。因此,如果$LAN包含不受信任的数据,请不要这样做。

票数 2
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/645706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档