티스토리 뷰

처음 shell programming 관련 글에서 if 를 만났을 때, 당황스러웠습니다.

 

if 가 사용되는 기본형을 봅시다.

 

if [ expression ]
then 
	...
fi

 

그 글에서 if 와 [ 사이에 공백이 필요하고 [ 와 expression 사이에도 공백이 필요하다고 강조를 하더군요.

 

공백이 왜 필요하지? 

 

if 다음에 ( 가 따라와야 하는  C/C++ 혹은 Java 등과 비교해보면 이상합니다.

 

그 언어들에서 if 와 ( 사이, ( 와 expression 사이에 공백을 요구하지 않았거든요.

 

 

그래서 이유를 알아 보았습니다. 

 

다른 프로그래밍 언어에서는 if 는 뒤에 논리식(logical expression)이 따라 옵니다.  

 

하지만 bash 는 사정이 다릅니다.

 

if command        #command 위치에는 function 이 올 수도 있다.
then
  ...
fi

 

if 와 then 사이에는 exit code 나 return value 를 생산하는 것이 옵니다.

 

즉,  

 

if 다음에는 논리식이 아니라 명령어나 함수가 와야 합니다.

 

응? 그렇다면 if 뒤에서 자주 보게되는 [ 는 정체가 ? 설마 명령어(command) ?

 

 

그랬습니다! which 로 확인한 [ 의 정체는 built-in command 였습니다. 

 

[ 는 test 명령어와 같은 기능을 합니다.

( 끝에 ] 가 필요하다는 점만 다릅니다. 예전에는 [ 가 'test' command 의 link 였던 적도 있었던 모양입니다.)

 

[ 가 독립된 명령어란 사실을 알게되자 공백과 관련된 의문은 모두 사라졌습니다. [  대신 test 를 생각하면 더 쉽게 이해됩니다

 

iftest 는 아무래도 이상하죠? if test 가 정상으로 보입니다.

 

또한 test 뒤에 공백이 없으면 명령어에 인자를 붙여 쓴 꼴이므로 문제가 발생하겠죠.(이 시리즈의 첫글의 내용도 공백관련이었습니다.)

 

 

다른 언어와 다르게 if 뒤에 명령어나 함수가 온다면 분기 판단은 어떻게 하는 걸까요?

 

if 와 then 사이의 명령어의 exit code 나 함수의 return value 가 0 일 때,  then 다음의 명령어들이 실행됩니다.

 

 

위의 script 를 실행하면 다음의 결과를 얻습니다.

 

 

return value 가 0 일 때, 참으로 평가받다니!

 

 exit code 나 return value 가 0 일 때, 명령어나 함수가 정상 종료를 의미해서 그런 거겠지만 상당히 헷갈리네요.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함