![(Ba)sh 参数扩展在脚本和交互式 shell 中不一致](https://linux22.com/image/186234/(Ba)sh%20%E5%8F%82%E6%95%B0%E6%89%A9%E5%B1%95%E5%9C%A8%E8%84%9A%E6%9C%AC%E5%92%8C%E4%BA%A4%E4%BA%92%E5%BC%8F%20shell%20%E4%B8%AD%E4%B8%8D%E4%B8%80%E8%87%B4.png)
我在尝试编写用于设置 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}
值保持原样。