sh%20%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E6%8B%A1%E5%BC%B5%E3%81%8C%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%81%A8%E5%AF%BE%E8%A9%B1%E5%9E%8B%E3%82%B7%E3%82%A7%E3%83%AB%E3%81%A7%E4%B8%80%E8%B2%AB%E3%81%97%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84.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
テストのために、より具体的ではないパターンを持つ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}
値はそのまま残ります。