싱글 브래킷의 포현식에는 조건을 판단하는 여러 테스트 연산자가 사용된다. 문자열을 비교하는 문자열 테스트 연산자에 대해 먼저 알아보자.
연산자 | 설명 |
---|---|
= 또는 == | 두 문자열이 같으면 참이다. |
≠ | 두 문자열이 다르면 참이다. |
> 혹은 < | 두 문자열을 사전식으로 비교(각 문자의 아스키 값 비교)한다. |
-n | 문자열의 길이가 0이 아니면 참이다. |
-z | 문자열의 길이가 0이면 참이다. |
문자열에 값이 설정되어 있지 않거나 빈 문자열인 경우, 문자열의 길이를 0으로 판단한다. |
싱글 브래킷의 표현식에 >, < 연산자를 사용할 때는 이스케이프 처리를 해야 제대로 인식한다.(백슬래시 붙이기) 그렇지 않으면 리디렉션으로 해석한다.
script 디렉토리에서 string.sh 라는 파일을 생성해보자. 파일 내용은 아래와 같다.
#!/bin/bash
A="hello"
B="world"
if [ "$A" == "$B" ]; then
echo "== opertaor: True"
else
echo "== operator: False"
fi
if [ "$A" != "$B" ]; then
echo "!= opertaor: True"
else
echo "!= operator: False"
fi
if [ "$A" \\> "$B" ]; then
echo "> opertaor: True"
else
echo "> opertaor: False"
fi
if [ -n "$A" ]; then
echo "-n opertaor: True"
else
echo "-n operator: False"
fi
if [ -z "$A" ]; then
echo "-z opertaor: True"
else
echo "-z operator: False"
fi
각각 false, true, false, true, false를 반환해야 한다. 스크립트를 실행시켜보자.
Bash에서는 변수나 셸에 입력하는 값을 모두 문자열로 인식한다. (숫자도 숫자로 이루어진 문자열로 인식) 그래서 let이나 expr 명령어를 사용했어야 했던 것처럼 if문에서 산술테스트 연산자를 별도로 제공한다.
연산자 | 설명 |
---|---|
-eq | equal의 약자, 연산자 좌우의 값이 같으면 참을 반환한다. |
-ne | not equal의 약자, 연산자 좌우의 값이 다르면 참을 반환한다. |
-le | less than or equal의 약자, 좌측 값이 우측보다 작거나 같으면 참을 반환한다. |
-lt | less than의 약자, 좌측 값이 우측보다 작으면 참을 반환한다. |
-gt | greater than의 약자, 좌측 값이 우측보다 크면 참을 반환한다. |
-ge | greater than or equal의 약자, 좌측 값이 우측보다 크거나 같으면 참을 반환한다. |
integer.sh에 다음과 같이 스크립트를 작성해보자.
#!/bin/bash
A="34"
B="34"
if [ "$A" -eq "$B" ]; then
echo "-eq opertaor: True"
else
echo "-eq operator: False"
fi
if [ "$A" -ne "$B" ]; then
echo "-ne opertaor: True"
else
echo "-ne operator: False"
fi
if [ "$A" -le "$B" ]; then
echo "-le opertaor: True"
else
echo "-le operator: False"
fi
B="56"
if [ "$A" -lt "$B" ]; then
echo "-lt opertaor: True"
else
echo "-lt operator: False"
fi
if [ "$A" -gt "$B" ]; then
echo "-gt opertaor: True"
else
echo "-gt operator: False"
fi
if [ "$A" -ge "$B" ]; then
echo "-ge opertaor: True"
else
echo "-ge operator: False"
fi
결과를 예측해보자. 처음에는 A와 B가 34로 같은 값을 가지기에 true, false, true가 출력될 것이다. 중간에 B가 56으로 수정되면서, lt는 true, gt는 false, ge도 false가 출력될 것이다.
이제 결과를 확인해보자.
mis-usage.sh 라는 스크립트 파일을 만들고 아래 내용처럼 작성해보자.
#!/bin/bash
A="34"
B="56"
echo "A=$A, B=$B"
if [ "$A" \\< "$B" ]; then
echo "< opertaor: True"
else
echo "< operator: False"
fi
A="112"
B="111111"
echo "A=$A, B=$B"
if [ "$A" \\< "$B" ];then
echo "< operator: True"
else
echo "< operator: False"
fi
이제 결과를 확인해보자
<는 문자열을 사전식으로 비교하기 때문에 문자열 34와 문자열 56을 비교한다. 그러면 3이 5보다 작아서 < 연산자는 참을 반환하고, True를 출력한다.
A와 B의 값이 세 번째 문자에서 달라지기 때문에, 더 큰 2를 가지고 있는 A가 더 큰 문자열로 연산된다. 그래서 False가 출력된다.