Chistory
리눅스 명령어 2. test와 if 본문
두번째로 정리해 볼 명령어는 바로 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 |