set -u 사용법이 예상대로 작동하지 않습니다.

set -u 사용법이 예상대로 작동하지 않습니다.

저는 set스크립트에서 다양한 옵션을 효과적으로 사용하는 방법을 배우고 있는데, set -u이것이 변수가 잘못 설정된 경우(예: 사용자 삭제) 스크립트를 종료하는 완벽한 방법인 것 같습니다. ~에 따르면남성페이지를 set -u클릭하고 set -e다음을 수행하세요...

-e  Exit immediately if a command exits with a non-zero status.
-u  Treat unset variables as an error when substituting.

이 기능을 테스트하기 위해 테스트 스크립트를 만들었지만 예상대로 작동하지 않는 것 같습니다. 어쩌면 누군가 내 문제를 나에게 더 잘 설명하고 내가 오해하고 있는 부분을 설명할 수 있을까요? 테스트 스크립트는 다음과 같습니다. 감사해요.

set -e
set -u
testing="This works"
echo $?
echo ${testing}
testing2=
echo $?
echo ${testing2}
testing3="This should not appear"
echo $?
echo ${testing3}

스크립트를 표시하고 싶습니다.0그리고"이거 효과가 있어", ${testing2}설정되지 않았기 때문에 실패합니다.

대신 보여주네0그리고"이거 효과가 있어", 준수하다0그런 다음0 이런 일은 일어나서는 안 된다

누구든지 지식을 제공할 수 있습니까? 감사해요.

답변1

"남자 난교"에서:

매개변수에 값이 할당된 경우 매개변수가 설정됩니다. 빈 문자열은 유효한 값입니다. 변수가 설정되면 unset 내장 명령을 통해서만 설정을 해제할 수 있습니다.

이렇게 하면 testing2=변수가 빈 문자열로 설정됩니다.

로 변경 unset testing2하고 다시 시도해 보세요.


이 경우 set -e할당에는 종료 코드 1이 없으므로 도움이 되지 않습니다. 마지막으로 실행된 명령(할당)의 종료 코드가 0인지 확인하려면 다음을 수행하십시오.이 질문을 읽어보세요:

$ false; a=""; echo $?
0

그리고 나는 set -e를 사용하는 것이 해결책이라기보다는 문제가 더 많다고 생각합니다.

설정되지 않은 변수를 사용하면 오류가 발생할 수 있습니다 set -u.

#!/bin/bash
set -u
testing="This works"
echo ${testing}
unset testing2
echo ${testing2}
testing3="This should not appear"
echo ${testing3}

다음을 출력합니다:

$  ./script.sh
This works
./script.sh: line 9: testing2: unbound variable

답변2

testing2=testing2변수를 실제로는 빈 문자열로 설정합니다 .설정되었습니다.

echo $testing99errexit그러나 대화형 Bash 셸( setup 없이 , 즉 ) 에서 실행 중인 경우 set -e다음 오류가 발생합니다.

bash: testing99: unbound variable

옆에

방금 스크립트를 테스트하면서 발견했습니다.인터렉티브껍데기 항상 나가지는 않는다변수를 확장하려고 할 때아직 설정되지 않음그리고 하나비대화형쉘(쉘 스크립트 실행)항상 종료. POSIX 매뉴얼 페이지에 따르면 set:

-u 쉘이 설정되지 않은 변수를 확장하려고 시도하고 즉시 종료되면 표준 오류에 메시지를 써야 합니다. 대화형 셸은 종료되어서는 안 됩니다.

대화형 Bash 쉘은 다음이 errexit아니면 종료되지 않습니다.반품설정되었습니다. 반면에 대화형 대시보드 셸은 set -e이전에 실행된 경우에도 종료되지 않습니다.

관련 정보