Skip to content

7. 테스트(Test Constructs)


if[](대괄호)로 조건을 묶지 않고도 아무 명령어나 테스트 할 수 있다. if/then은 명령어 목록의 종료 상태가 0인지 테스트를 해보고 맞다면 다음 명령어들을 실행시킨다. if/then은 중첩된 비교나 테스트가 가능하다.


테스트 전용 명령어로 [(왼쪽 대괄호)라는 것이 있다. test 명령어와 동의어이고 내장 명령이다. 이 명령어는 자신의 인자를 비교식이나 파일 테스트로 인식해 연산의 결과에 따른 종료 상태를 리턴한다. 또한, 좀 더 친숙한 비교 연산을 제공해 주는 [[]]를 사용할 수 있으며, 주의할 점은 [[는 명령어가 아닌 키워드라는 것이다.


(())let은 자신이 계산한 산술식이 0이 아닌 값을 가질 경우에 종료 상태 0을 리턴한다. 따라서 이런 산술 확장은 산술 비교를 할 때 쓸 수 있다.


예제) 무엇이 참인지 확인하기
#!/bin/bash

echo "\"0\" 테스트"
# "0" 테스트
if [ 0 ]; then
    echo "0은 참"
else
    echo "0은 거짓"
fi
# 0은 참

echo "\"NULL\" 테스트"
# "NULL" 테스트
if [ ]; then
    echo "NULL은 참"
else
    echo "NULL은 거짓"
fi
# NULL은 거짓

echo "\"xyz\" 테스트"
# "xyz" 테스트
if [ $xyz ]; then
    echo "초기화 안 된 변수는 참"
else
    echo "초기화 안 된 변수는 거짓"
fi
# 초기화 안 된 변수는 거짓

echo "\"-n \$xyz\" 테스트"
# "-n $xyz" 테스트
if [ -n "$xyz" ]; then
    echo "초기화 안 된 변수는 참"
else
    echo "초기화 안 된 변수는 거짓"
fi
# 초기화 안 된 변수는 거짓

# 널 값으로 초기화
xyz=
echo "\"-n \$xyz\" 테스트"
# "-n $xyz" 테스트
if [ -n "$xyz" ]; then
    echo "널 변수는 참"
else
    echo "널 변수는 거짓"
fi
# 널 변수는 거짓

echo "\"false\" 테스트"
# "false" 테스트. "false"는 문자열
if [ "false" ]; then
    echo "\"false\"는 참"
else
    echo "\"false\"는 거짓"
fi
# "false"는 참

echo "\"\$false\" 테스트"
# "$false" 테스트
if [ "$false" ]; then
    echo "\"\$false\"는 참"
else
    echo "\"\$false\"는 거짓"
fi
# "$false는 거짓

exit 0


elifelse if의 단축형이다. 바깥쪽 if/then의 안쪽에 중첩해서 쓰는 효과를 가져온다.


if [ condition1 ]
then
    command1
    command2
    command3
# else if와 같음
elif [ condition2 ]
then
    command4
    command5
else
    default_command
fi


if test condition-trueif [ condition-true ]는 완전히 똑같은 표현이다. [test 명령어를 부르는 토큰이기 때문에 ]가 꼭 필요하진 않지만 새 버전의 BASH에서는 있어야 한다.


예제) []와 test의 동일함
#!/bin/bash

if test -z "$1"; then
    echo "명령어줄 인자가 없습니다."
else
    echo "첫 번째 명령어줄 인자는 $1 입니다."
fi

# 위으 코드 블럭과 기능적으로 동일함
if [ -z "$1" ]; then
    echo "명령어줄 인자가 없습니다."
else
    echo "첫 번째 명령어줄 인자는 $1 입니다."
fi

exit 0


[[]]는 셸 상에서 []과 동일하다. 이 명령어는 확장 테스트 명령어이다. [[]]에서는 파일명 확장이나 낱말 분리가 일어나지 않지만 매개변수 확장이나 명령어 치환은 일어난다. [] 말고 [[]]를 쓰면 많은 논리적 에러들을 막을 수 있다. 예를 들어 &&, ||, <, > 연산자들은 []에서 에러를 내지만 [[]]에서는 잘 동작한다.


#!/bin/bash

file=/etc/passwd

if [[ -e $file ]]; then
  echo "비밀번호 파일이 존재합니다."
fi
# 비밀번호 파일이 존재합니다.


(())는 산술식을 평가해서 확장해 준다. 그 산술식이 0으로 평가되면 종료 상태 1이나 "false"를 리턴하고 0이 아닌 값으로 평가되면 종료 상태 0이나 "true"를 리턴한다.


예제) (())로 산술식 테스트 하기
#!/bin/bash

((0))
echo "\"(( 0 ))\"의 종료 상태는 $?."
# "(( 0 ))"의 종료 상태는 1.

((1))
echo "\"(( 0 ))\"의 종료 상태는 $?."
# "(( 0 ))"의 종료 상태는 0.

((5 > 4))
echo $?
# 0

((5 > 9))
echo $?
# 1

exit 0

References