스크립트가 있습니다:
#!/bin/bash
s='1 2, 3 4,'
s0="$(echo ${s//,/ }|tr -s ' ')"
echo "s0: $s0"
d="'${s0//+([[:space:]])/"' '"}'"
echo "d: $d"
이 스크립트를 실행하면 출력은 다음과 같습니다.
$ ./test.sh
s0: 1 2 3 4
d: '1 2 3 4'
Bash 프롬프트에서 명령을 하나씩 실행하면 $d
변수가 올바르게 표시됩니다.
$ s='1 2, 3 4,'
$ s0="$(echo ${s//,/ }|tr -s ' ')"
$ echo "s0: $s0"
s0: 1 2 3 4
$ d="'${s0//+([[:space:]])/"' '"}'"
$ echo "d: $d"
d: '1' '2' '3' '4'
$
명령은 bash에서 실행됩니다.
$ type bash
bash is /bin/bash
$ echo $0
-bash
예상 대신 $d
스크립트 실행 중에 설정되는 이유는 무엇입니까 ?'1 2 3 4'
'1' '2' '3' '4'
답변1
Bash에서는 확장 글로브가 기본적으로 활성화되어 있지 않으므로 스크립트에서 명시적으로 활성화 +(...)
해야 합니다 .shopt -s extglob
대화형 셸이 extglob
활성화되어 있을 수 있으므로(일부 시작 파일에서) 명령줄에서 바꾸기 명령을 시도하면 예상대로 작동합니다. 그러나 스크립트에서는 대부분의 시작 파일이 읽히지 않고 extglob
비활성화되며 더하기 기호와 대괄호는 리터럴 문자로 처리됩니다. 문자 클래스는 두 가지 모두에서 동일한 방식으로 작동하므로 +( )
꺼지면 유사한 콘텐츠가 패턴과 일치합니다.extglob
여기서 패턴은 어떤 것과도 일치하지 않으며 대체도 없으며 유일한 변경 사항은 d
확장 주위에 작은따옴표가 추가된다는 것입니다 ${s0//...}
.