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
テストのために、より具体的ではないパターンを持つ2番目のバリエーションを追加しました。
対話型bashシェルでこのコードを実行すると、期待どおりに機能します。
$ 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
+([0-9])
この機能が機能するには、拡張グローブを有効にする必要があります。設定で設定されている可能性があるため、bashrc
対話型シェルでは有効になりますが、スクリプトでは有効になりません。shopt -s extglob
有効にするには、スクリプトに追加してください。バラよりマニュアルのパターンマッチング。それ以外の場合、パターンは一致せず、${var/pattern/replacement}
値はそのまま残ります。