Bash
相互依賴的嵌套變數
我正在嘗試在我的 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
因此,如果包含不受信任的數據,請不要這樣做。