(Ba)sh 参数扩展在脚本和交互式 shell 中不一致

(Ba)sh 参数扩展在脚本和交互式 shell 中不一致

我在尝试编写用于设置 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 命令,这应该

  1. 删除现有的默认路由
  2. 创建一条新路线,并将该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}值保持原样。

相关内容