bash 스크립트는 bash 프롬프트에서 명령을 실행할 때와 다른 출력을 생성합니다.

bash 스크립트는 bash 프롬프트에서 명령을 실행할 때와 다른 출력을 생성합니다.

스크립트가 있습니다:

#!/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//...}.

관련 정보