Shell 데이터 타입과 test 명령
Shell에는 숫자와 문자를 구분하는 데이터 타입이 없고, 사칙연산을 위한 연산자도 없다. 명령문을 구성하는 모든 것은 문자열이고, 산술 연산은 확장이나 명령을 통해 제공된다.
즉, 32와 "32"는 동일하다. 또한 문자열을 다루는 부분에서는 문자열로, 산술 연산을 다루는 부분에서는 숫자로 사용된다.
test 명령은 shell Script 작성 시 빠지지 않고 등장하는 표현식으로 보통 조건문에 많이 사용한다. test와 [는 같은 명령이다.
test -d /etc; echo $?
[ -d /etc ]; echo $?
Shell에서 test 명령을 사용할 때는 다음과 같은 점을 주의해야 한다.
test 명령 사용 시 주의점
1. 변수 비교 시 qoute 처리 필요
test 명령에서 연산자를 사용하지 않는 경우, 존재하지 않거나 값이 null인 경우에는 false(1)이고 그 외에는 전부 true(0)이다. 아래 명령은 문자열 false에 대한 test를 수행하기 때문에 true 값인 0을 반환한다.
[ false ]; echo $?
때문에 변수를 비교할 때는 qoute 처리해야 한다.
AA=""
[ -n $AA ]; echo $?
[ -n "$AA" ]; echo $?
2. 숫자 비교 시 문자열 연산자 사용 불가
일반적인 프로그래밍 언어에서 <. >는 숫자를 비교할 때 사용하지만 test 명령에서는 사전적인 순서를 기준으로 문자를 비교할 때 사용한다. 따라서 숫자의 크기를 비교할 때는 -gt, -lt를 사용해야 한다.
[ 100 \> 2 ]; echo $?
[ 100 -gt 2 ]; echo $?
3. Array 비교 시 * 사용 필요
변수를 quote 하지 않으면 ${array[@]}, ${array[*]}는 IFS 값에 의해 단어 분리가 되므로 동일하지만, quote 처리를 하면 의미가 달라지므로 주의해야 한다.
${array[@]}는 각 원소를 quote 하여 나열하고, ${array[*]}는 모든 원소를 하나의 " " 내에 나열한다. 따라서 Array 비교 시에는 *를 사용해야 한다.
AA=(11 22 33)
BB=(11 22 33)
[ "${AA[*]}" = "${BB[*]}" ]; echo $?
[ "${AA[@]}" = "${BB[@]}" ]; echo $?
AND, OR, NOT
test 명령에서 AND, OR 연산자로 -a, -o를 사용할 수 있다. 또는 Shell 메타문자인 &&, ||를 사용할 수도 있다.
if [ A = A -a B = B ]; then ...
if [ A = A -o B = B ]; then ...
if [ A = A ] && [ B = B ]; then ...
if [ A = A ] || [ B = B ]; then ...
NOT은 !를 사용한다. test 명령 내외 모두 사용할 수 있다.
if test ! A = A; then ...
if ! [ A = A ]; then ...
[[ ]]
[[ ]]는 test 명령의 기능 확장 버전으로, 명령어인 [ ]와 다르게 [[ ]]은 쉘 키워드라는 점이다. 따라서 다른 명령과 달리 shell에서 자체적으로 해석해 실행하기 때문에 명령어라서 생기는 제약사항 없이 편하게 사용할 수 있다.
[[ a < b ]]; echo $?
AA=""
[[ -n $AA ]]; echo $?
참고 문서
https://mug896.github.io/bash-shell/test.html