shell에서 Array를 어떻게 사용 할까요?
shell에서 Array를 사용 할 수 있긴 할까요?

기본 sh에서는 딱히 방법이 없습니다.
그러나, 배열처럼 사용할 수는 있지요.

#!/bin/sh

vArray="A,B"

for i in `echo ${vArray} | tr ',' '\n'` ; do
   echo ${i}
done

위 결과는 다음과 같이
A
B
로 나옵니다.

"tr"은 문자열 변환, 삭제에 사용하는 명령어인데, 이 명령어를 사용하면 마치 Array에서 가져오는 것처럼 사용할 수는 있으나, direct access는 힘듭니다.
위 프로그램은 vArray 변수를 출력하면서 "," -> "\n"로 변환하여 한 라인씩 처리하기 위함입니다.

기본 shell에서는 안되지만, POSIX 계열인 bash에서는 사용 가능합니다.
#!/bin/bash

declare -a vArray

vArray=("A" "B")
vArraySize=${#vArray[@]}
vNo=0

while [ $vNo -lt $vArraySize ]
do
        echo ${vArray[$vNo]}
        vNo=`expr $vNo + 1`
done

unset vArray

vArray에서 ""로 값들을 나열하고 있으며,  vArray의 size도 구할 수 있습니다. ${#vArray[@]}
sh에서 안 되는 direct access도 가능합니다. ${vArray[$vNo]}
Array 변수 사용은 반드시 괄호를 사용해야 합니다.
그리고, 1차원 배열은 지원합니다.
declare와 unset은 사용하지 않아도 됩니다.

이런 Array를 함수의 인자로도 전달 가능할까요?

#!/bin/bash

vArray1=("A" "B")
vArray2=("C" "D")


#-------------- [print_array function] -----------------
print_array()
{

        vArray=("${!1}")
        vArraySize=${#vArray[@]}
        vNo=0

        while [ $vNo -lt $vArraySize ]
        do
                echo ${vArray[$vNo]}
                vNo=`expr $vNo + 1`
        done

}

echo "================="
print_array vArray1[@]
print_array vArray2[@]

vArray1=(${vArray1[@]} "a")
unset vArray2[1]

echo "================="
print_array vArray1[@]
print_array vArray2[@]

위의 결과는 다음과 같습니다.
=================
A
B
C
D
=================
A
B
a
C

함수를 호출할 경우에는 함수명 뒤에 vArray[@], 함수 내에서는 ("${!1}")로 표현해야 합니다.
함수 내에서 사용하는 표현이 약간 어렵죠? 그냥 외웁시다.
참고로, 표현 내의 숫자("${!1}")는 몇 번째 인자인지 나타냅니다.

${vArray[@]}은 배열 전체를 의미합니다.
${#vArray[@]}은 배열의 크기를 의미합니다.

위 프로그램에서 배열에 값을 추가하고 삭제하는 표현도 두었습니다.
배열에 값을 추가하는 것은 vArray=(${vArray[@]} "a")
배열에 값을 삭제하는 것은 unset vArray[1]

쉘에서도 배열을 자유자재로 사용한다면 프로그래밍이 쉬워지지 않을까요?


블로그 이미지

쩐의시대

나답게 살아가고 나답게 살아가자

,