Chistory

리눅스 명령어 2. test와 if 본문

개발 & CS/Linux

리눅스 명령어 2. test와 if

Chistory 2019. 12. 5. 20:48

두번째로 정리해 볼 명령어는 바로 test다. 

test 명령어는 쉽게 생각하면 bash에서의 조건문 역할을 해준다. 사실 test를 사용해 보지 않은 리눅스 유저도 있을 수 있다.

하지만 흔히 쉘 스크립트를 쓰다 보면, 다음과 같은 구문을 많이 볼 것이다. 

#!/bin/bash

ls_count=`ls /home | wc -l`

if [ $ls_count -eq 0 ]; then
	echo "home directory is empty"
else
	echo "home direcotry is not empty"
fi

단순히 /home 디렉토리가 비어있는지를 확인할 수 있는 코드이다. 

바로 여기에도 test 명령어가 숨어있다. 대괄호 '[', ']' 로 감싸져있는 저 부분은, test 뒤에 괄호 안의 인자들을 넣어서 실행시킨 것과 같은 결과를 보여준다. bash를 인터프리터로 동작시킬 때, 저 부분을 test 명령어로 치환해주기 때문이다. 

사실 쉘 스크립트 자체가 굉장히 간단한 구조기 때문에 위와 같은 보기 좋은 코드가 나올 수 있다. if는 바로 뒤에 실행되는 명령어의 exit 코드를 보고, 0일 경우 그 뒤 명령행으로 넘어간다. 0이 아닐 경우, 다음 else나 elif로 넘어가게 되어있다. 

그럼 바로 test, 그리고 쉘 스크립트에서의 괄호의 역할이 뭔지 알 수 있겠다. 안의 조건문이 맞으면 0, 아니면 1을 내보내준다. 다음 커맨드를 실행시켜보자

test 0 -eq 0 && echo $? || echo $?

 

test 뒤의 인자들은, 0과 0이 eq, 즉 equal, 같은지를 물어보는 것이고 바로 뒤의 &&와 ||는 bash에서의 if문과 같은 조건식이다. 역시 &&는 바로 앞의 명령행의 실행 결과가 0이면 실행시키고, ||는 0이 아닐 경우 뒤를 실행시킨다. $? 는, 바로 전 실행의 exit 코드를 나타내는 환경 변수이다. 

흔히 이 괄호와 비슷해 보이는 스크립트안의 test문 때문에, 많이들 하는 실수가 띄어쓰기이다. 

다음과 같은 스크립트는 오류를 뱉는다. 

if ["$str" = "hello"]; then 
	echo "is matched"
fi

인터프리터가 위 구문을 해석하고 나면, 다음과 같은 결과를 받아올 것이다. 

if test"$hello" = "hello"
echo "is matched"
fi

# 또는
text"$hello" = "hello" && echo "is matched"

사실 배쉬 인터프리터 구조를 잘 모르기에, 확답할 수는 없지만 위 두가지 중 하나의 코드로 해석되지 않을까 싶다. 

보면 test바로 뒤에 공백 없이 "$hello"가 온다면, 리눅스 명령 체계에서는 해당 바이너리를 찾을 수 없어 오류를 뱉을 수 밖에 없다. 이러한 쉘 스크립트와 if, test의 구조를 알게 된다면, 조금 더 좋은 스크립트를 짤 수 있고, 다양한 자동화 환경에서 응용해 나갈 수 있다. 

'개발 & CS > Linux' 카테고리의 다른 글

프록시 솔루션간단 비교..  (0) 2020.01.03
haproxy libssl 에러  (0) 2020.01.03
리눅스 명령어 3. 파일명 일괄변경?  (1) 2019.12.16
리눅스 명령어 1. dd  (0) 2019.12.03
쉘스크립트  (0) 2019.09.16
Comments