명령문 블록

명령문 블록

존재하다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'
}

예.

관련 정보