존재하다Linux 프로그래밍 시작하기책. 에 관한 섹션이 있습니다.명령문 블록. 이 섹션은 아래에 설명되어 있습니다.
명령문 블록
하나의 문만 허용되는 여러 문을 사용하려는 경우(예: AND 또는 OR 목록), 중괄호 {}로 묶어 문 블록을 형성할 수 있습니다. 예를 들어 다음 코드를 참조하세요.
get_confirm && {
grep −v "$cdcatnum" $tracks_file > $temp_file
cat $temp_file > $tracks_file
echo
add_record_tracks
}
문 블록의 코드가 어떻게 실행되는지 설명해주세요...
답변1
내부 코드는 { ... }
중괄호가 없는 것과 동일하게 실행됩니다. 단, 이제 의 종료 상태에 의존합니다 get_confirm
.
0 종료 상태("성공")로 종료 하면 get_confirm
블록이 실행되고, 그렇지 않으면 실행되지 않습니다.
이는 거의 다음과 같습니다.
if get_confirm; then
# the contents of the block goes here
fi
(내 의견으로는 더 좋아 보인다). "거의"는 get_confirm
반환되는 경우 각 문에서 보고하는 결과 상태에 차이가 있기 때문입니다.잘못된(단락 코드는 동일한 변수를 $?
0이 아닌 값으로 설정하지만 if
명령문은 동일한 변수를 0으로 설정합니다.) 이는 셸에 설정된 옵션과 주변 코드의 기능에 따라 중요할 수 있습니다.
IMHO 책의 예는 가 아닙니다 { ... }
.
{ echo 'hello world'; date; } >file
단일 리디렉션을 사용하여 { ... }
블록에 있는 두 명령의 표준 출력을 동일한 파일로 리디렉션합니다 .
이는 다음과 유사합니다(이 경우에도 동일한 효과가 있습니다).
( echo 'hello world'; date ) >file
그러나 그 안의 명령문은 { ... }
쉘과 동일한 환경에서 실행되는 반면, in의 명령문은 ( ... )
서브쉘(별도의 환경)에서 실행됩니다.
당신은 차이점을 볼 수 있습니다
{ a=42; }; echo $a
그리고
( a=1973 ); echo $a
첫 번째는 인쇄 42
하지만 두 번째는 인쇄하지 않습니다 1973
(할당은 서브쉘에서 발생하며 외부 환경에는 영향을 미치지 않습니다).
}
구문에 대한 참고 사항: 블록의 끝은 { ... }
줄 바꿈 또는 뒤에 와야 합니다 ;
. 유효하지 않으며 { echo 'hello' }
,{ echo 'hello'; }
{
echo 'hello'
}
예.