명령 기반 if 문

명령 기반 if 문

if명령을 실행하는 방법 은 다음과 같습니다 .

$if echo test | grep st ; then echo yes ; fi ; echo $?
test
yes
0

좋아 보인다. 불일치로 시도해 보겠습니다.

$if echo test | grep 123 ; then echo yes ; fi ; echo $?
0

그건 맞지 않습니다. 명령문 은 if정상적으로 실행되지만 0 종료 코드를 반환합니다.

누군가 나에게 이것을 설명해 줄 수 있습니까?

답변1

$?after if블록에는 문의 종료 상태가 포함됩니다 if. 기준지정하다

명령의 종료 상태는 또는 if종료 상태 여야 합니다.thenelse 화합물 목록실행되었거나 실행되지 않은 경우 0입니다.

첫 번째 경우에는 명령의 종료 상태가 표시됩니다 echo yes. 두 번째 경우에는 then또는 블록 else에서 명령이 실행되지 않으므로 종료 상태는 0입니다.

답변2

Bash 매뉴얼에서 (형식 및 강조 추가):

목록이면 목록; 목록이면 ] ... [다른 목록]

목록이 실행되면. 종료 상태가 0이면 then 목록이 실행됩니다. 그렇지 않으면 각 elif 목록이 차례로 실행되고 종료 상태가 0이면 해당 then 목록이 실행되고 명령이 완료됩니다. 그렇지 않으면 else 목록이 있으면 실행됩니다. 종료 상태는 마지막으로 실행된 명령의 종료 상태입니다.조건이 참으로 테스트되지 않으면 0입니다.

따라서 종료 상태를 이해하는 것이 중요합니다.무엇실제로 보고 계십니다. 귀하의 예에서는 echo test | grep 123마지막 명령이 성공적으로 종료되지 않았습니다. 이 작업을 먼저 수행한 다음 종료 상태를 테스트 하면 grep0이 아닌 종료 상태를 반환하는 것을 볼 수 있습니다.

$ grep 'noexist' /etc/passwd
$ echo $?
1

대조적으로 if 문에서는 조건으로서의 명령이 true인지 테스트하지 않으므로 사양 및 매뉴얼에 따르면 종료 상태는 0입니다.

grep '123'그런데 , 현재 디렉터리에 파일 123이 있는 경우 인용되지 않은 패턴으로 인해 다른 문제가 발생할 수 있으므로 이렇게 하세요 .


grep 및 인용 패턴에 대한 참고 사항

스티븐 지터논평마지막 단락의 설명. 이것은 반드시 이 질문의 주제와 관련이 없으며 이미 다루었습니다.여기, 비슷한 질문에 답변했습니다.여기, 하지만 흥미롭기 때문에 다른 방향으로 가겠습니다. 두 가지 예를 살펴보겠습니다.

grep input여기에는 따옴표가 없는 간단한 문자열이 있습니다 . grep구문은 첫 번째 문자열을 패턴으로 처리하는 것입니다. 여기서는 문제 없습니다. 다음과 같이 작동합니다.

bash-4.3$ strace -e trace=execve grep input <<< "this is input line"
execve("/bin/grep", ["grep", "input"], [/* 80 vars */]) = 0
this is input line
+++ exited with 0 +++

그러나 정규 표현식(당신이 생각하는 것)이 있으면 어떤 일이 발생하는지 확인하십시오.

bash-4.3$ strace -e trace=execve grep input* <<< "this is input line"
execve("/bin/grep", ["grep", "input.txt", "input.txt.bak"], [/* 80 vars */]) = 0
+++ exited with 1 +++

쉘은 사용자를 보고 *경로 이름 확장을 수행합니다. 이제 쉘에 의해 실행되는 실제 명령은 다음과 같으며 구문 grep some_file_1 some_file_2 some_file_3에 따라 grep명령은 이제 내부적으로 문자열을 찾습니다 grep [OPTIONS] PATTERN [FILE...]. 실제로 이것을 보십시오:input.txtinput.txt.bak

bash-4.3$ echo "I have input.txt here" > input.txt.bak
bash-4.3$ grep input* <<< "this is input line"
I have input.txt here

입력 문자열은 완전히 무시되고 grep확장된 파일 이름만 검색되어 원치 않는 결과가 나타납니다.

관련 정보