(Ba)sh パラメータ拡張がスクリプトと対話型シェルで一貫していない

(Ba)sh パラメータ拡張がスクリプトと対話型シェルで一貫していない

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

テストのために、より具体的ではないパターンを持つ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}値はそのまま残ります。

関連情報