(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

테스트를 위해 덜 구체적인 패턴을 가진 두 번째 변형을 추가했습니다.

대화형 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}값이 그대로 유지됩니다.

관련 정보