我在尝试编写用于设置 VPN 默认路由指标的脚本时遇到了以下参数扩展问题。
出于测试目的,我将代码简化为以下内容:
vpn_route='default via 10.106.160.1 proto static metric 50'
echo ip route del "$vpn_route"
echo ip route add "${vpn_route/metric +([0-9])/metric 101}"
echo ip route add "${vpn_route/%metric */metric 101}"
一旦我删除了 echo 命令,这应该
- 删除现有的默认路由
- 创建一条新路线,并将该
metric <number>
部分替换为metric 101
为了进行测试,我添加了第二个变体,其模式不太具体。
如果我在交互式 bash shell 中执行此代码,它将按预期工作:
$ vpn_route='default via 10.106.160.1 proto static metric 50'
$ echo ip route del "$vpn_route"
ip route del default via 10.106.160.1 proto static metric 50
$ echo ip route add "${vpn_route/metric +([0-9])/metric 101}"
ip route add default via 10.106.160.1 proto static metric 101
$ echo ip route add "${vpn_route/%metric */metric 101}"
ip route add default via 10.106.160.1 proto static metric 101
但是,如果我执行该脚本,我会得到以下结果:
$ cat lower-vpn-priority.sh
#!/usr/bin/env bash
vpn_route='default via 10.106.160.1 proto static metric 50'
echo ip route del "$vpn_route"
echo ip route add "${vpn_route/metric +([0-9])/metric 101}"
echo ip route add "${vpn_route/%metric */metric 101}"
$ bash lower-vpn-priority.sh
ip route del default via 10.106.160.1 proto static metric 50
ip route add default via 10.106.160.1 proto static metric 50
ip route add default via 10.106.160.1 proto static metric 101
谁能向我解释一下这是怎么回事? :)
答案1
您需要启用扩展的 glob 才能+([0-9])
工作。它可能在您的 中设置bashrc
,因此在交互式 shell 中启用,但不在脚本中启用。添加shopt -s extglob
到脚本以启用它。看手册中的模式匹配。如果没有它,模式将不匹配,并且${var/pattern/replacement}
值保持原样。