Bash

相互依賴的嵌套變數

  • April 19, 2021

我正在嘗試在我的 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: syntax error: bad replacement**

如何呼叫也包含變數的變數?我需要擴展 $ LAN variable whilst expanding the $ WG_guest_server_port 也依賴於第一個 $LAN 變數。

NB Ash 是 Bash 的輕量級版本,通常隨 Busybox 一起提供。我正在為 OpenWrt 社區 Wiki 編寫腳本,因此所有版本的 OpenWrt 都包含 ash(Busybox)。

${WG_${LAN}_server_port}在我知道的任何外殼中都不起作用。在 Ksh、Bash 或 Zsh 中,您可以使用間接引用的方法,即引用另一個命名的變數。

但是你說的是 OpenWrt 和 ash,所以你可能只有 POSIX 的基本功能。

在這種情況下,您可能需要退回到eval,儘管它很醜陋。

你可以做這樣的事情,首先將內容WG_guest_server_port間接載入到另一個變數,然後在 here-doc 中使用它:

eval "serverport=\${WG_${LAN}_server_port}"
cat <<EOF > "/etc/wireguard/peer.conf"
Endpoint = ${DDNS}:${serverport}
EOF

請注意,這意味著內容${LAN}成為一行程式碼的一部分。惡意使用者可以形成一個特殊值,導致腳本執行任意命令。$LAN因此,如果包含不受信任的數據,請不要這樣做。

引用自:https://unix.stackexchange.com/questions/645706