티스토리 뷰

 

'나는 if 뒤에 안전하게 test, [ 만 쓸거야!'

 

다른 모든 사람도 이런 마음으로 script 를 작성한다면 참 좋을 텐데...

다른 언어들에서도 side effect 를 이용하는 code 를 보게 되듯이 bash script 에서도 마찬가지입니다.

다른 이들의 code 를 보고 당황하지 않으려면 종종 등장하는 것들은 알고 있을 필요가 있을 겁니다.

 

이미 앞선 글들을 통해 기본은 

 

if 는 일반적으로 command 또는 function 이 따라 온다.

 

임을 밝혔습니다. (물론 그중에서도 [ 혹은 test 가 가장 흔한 경우일 겁니다.)

 

그럼 '일반적' 이지 않은 것은 뭘까요?

command 와 function 이 아님에도 if 뒤에서 비교적 자주 보게 되는 것들은 무엇일까요?

 

앞에서 소개한 바 있는 subshell  을 부르는 ( ) 를 if 다음의 위치에서 간혹 보게 됩니다.  

subshell 은 일련의 command list 를 다른 환경에서 실행시키는 거니까 대범하게 command 로 봐 줍시다. 

 

그 외에는 뭐가 있을까요?

이 시점에서는 눈치 채신 분도 있겠지만 사실 if 뒤에는 exit code 나 return value 를 발생시키는 모든 것이 올 수 있습니다.

온갖 것을 가져다 놓고 테스트해보고 side effect 를 누릴 수 있겠지만, 별로 일관성은 없으니 넘어가겠습니다.

 

 

여기서는 ! 를 소개합니다. 

우선 type ! 로 확인하면 ! 는 예약어(reserved word) 로 나오고 독립적인 command 로 간주되지는 않습니다.

그런데 terminal 에서 ! 를  마치 독립적인 command 인 것처럼 수행(?)하면 재미있는 일이 벌어집니다.

 

 

위 그림에서 확인할 수 있듯이 마지막으로 실행된 process 의 종료 상태를 바꾸어 줍니다.

특수 변수 2 개만 소개하겠습니다. 한꺼번에 너무 많이 소개하면 헷갈립니다. 천천히 가시죠.

 

$?  : 직전 process 의 exit code

 

$$ : 실행중인 process 의 PID

 

이처럼 ! 는 다른 명령어와 결합 exit code 를 바꿔주기 때문에 독자적인 command 가 아님에도 if 바로 뒤에 나올 수 있습니다.

 

#!/bin/bash

num=0

if ! [ $num -eq 0 ]
then
  echo "true"
else
  echo "false"
fi

 

위의 script 에서 ! 는 명령어 [ 의 exit code 를 바꿔줍니다. 반면 다음 script 에서는 ! 가 논리적 '부정'으로 사용됩니다.

 

#!/bin/bash

num=0

if [ ! $num -eq 0 ]
then
  echo "true"
else
  echo "false"
fi

 

물론 두 script 는 같은 결과를 얻습니다.  

논리적 '부정' 으로만 생각해서 의외의 위치에서 ! 를 만났을 때 당황하지 맙시다.

 

 

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/06   »
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
글 보관함