다음 코드는 "if" 문이 일찍 종료되도록 하고 "if" 블록의 "echo" 명령을 실행하지 않게 합니다. 나는 알고 싶다왜이는 "if" 블록에서만 발생하며 스크립트의 주요 부분에서는 발생하지 않습니다. 참고: ':='를 ':-'로 변경하면 문제가 해결된다는 것을 알고 있습니다. 문제를 해결하려는 것이 아니라 문제를 일으키는 'if' 블록의 실행 환경 간의 차이점을 이해하고 싶습니다. 우선적으로 발생합니다.
#!/bin/bash
if true; then
VAR=${$1:='val'}
echo "This does not run"
fi
VAR=${$1:='val'}
echo "This does run"
출력은 다음과 같습니다
line 4: ${$1:='val'}: bad substitution
line 7: ${$1:='val'}: bad substitution
This does run
다시 말하지만 저는 오류 메시지를 대체하여 오류를 수정하는 데 관심이 없으며 이를 수행하는 방법과 이런 일이 발생하는 이유를 이해합니다. 내가 이해하려고 하는 것은 echo "This does not run"
위의 "if" 블록에 잘못된 대체가 있을 때 해당 행이 실행되지 않는 이유입니다.
다음 bash 버전으로 재인쇄되었습니다:
GNU bash, 버전 5.1.16(1)-릴리스(x86_64-pc-linux-gnu)
GNU bash, 버전 4.2.46(2)-릴리스(x86_64-redhat-linux-gnu)
답변1
Kusalananda가 의견에서 지적했듯이 이는 본질적으로 설명된 것과 동일합니다.복합 명령에서 Bash 옵션 설정.
~에서배시 참조:
다음은 명령을 읽고 실행할 때 쉘의 작업에 대한 간략한 설명입니다. 기본적으로 쉘은 다음을 수행합니다.
토큰을 간단한 합계로 구문 분석복합 명령(셸 명령 참조)
다양한 수행쉘 확장(셸 확장 참조) 확장된 토큰을 파일 이름 목록(파일 이름 확장 참조)과 명령 및 인수로 나눕니다.
...
구현하다명령(명령 실행 참조).
명령문의 블록은 if
다음과 같습니다.복합 명령그리고 확장 오류가 있습니다. 즉, VAR=${$1:='val'}
전체 블록이 실패하고 6단계에 도달하지 못하며 echo
첫 번째 단계가 실행되지 않습니다.
확장 오류에 대한 이러한 특수 처리는 POSIX 표준을 위반한다는 점에 유의하세요.섹션 2.8.1설명하다확장된 오류로 인해 비대화형 셸이 종료되어야 합니다..
POSIX 모드에서 Bash는 일관되게 작동합니다.
% bash horse
horse: line 2: ${$1:='val'}: bad substitution
horse: line 4: ${$1:='val'}: bad substitution
This does run
% bash --posix horse
horse: line 2: ${$1:='val'}: bad substitution
Bash를 무죄 판결하려면 이 위반 사항은 다음과 같습니다.녹음된:
다음 목록은 "POSIX 모드"가 적용될 때 변경되는 사항입니다.
- 지정문 다음에 명령 이름이 없을 때 변수 지정 오류가 발생하면 비대화식 쉘이 오류 상태로 종료됩니다.