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
elif
는 else if
의 단축형이다. 바깥쪽 if
/then
의 안쪽에 중첩해서 쓰는 효과를 가져온다.
if [ condition1 ]
then
command1
command2
command3
# else if와 같음
elif [ condition2 ]
then
command4
command5
else
default_command
fi
if test condition-true
와 if [ condition-true ]
는 완전히 똑같은 표현이다. [
는 test
명령어를 부르는 토큰이기 때문에 ]
가 꼭 필요하진 않지만 새 버전의 BASH에서는 있어야 한다.
#!/bin/bash
if test -z "$1"; then
echo "명령어줄 인자가 없습니다."
else
echo "첫 번째 명령어줄 인자는 $1 입니다."
fi
# 위으 코드 블럭과 기능적으로 동일함
if [ -z "$1" ]; then
echo "명령어줄 인자가 없습니다."
else
echo "첫 번째 명령어줄 인자는 $1 입니다."
fi
exit 0
[[]]
는 셸 상에서 []
과 동일하다. 이 명령어는 확장 테스트 명령어이다. [[]]
에서는 파일명 확장이나 낱말 분리가 일어나지 않지만 매개변수 확장이나 명령어 치환은 일어난다. []
말고 [[]]
를 쓰면 많은 논리적 에러들을 막을 수 있다. 예를 들어 &&
, ||
, <
, >
연산자들은 []
에서 에러를 내지만 [[]]
에서는 잘 동작한다.
(())
는 산술식을 평가해서 확장해 준다. 그 산술식이 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