Skip to content

1. 배열(Array)


배열은 array[x]처럼 선언할 수도 있고, declare -a array처럼 직접적으로 지정해 줄 수도 있다. 배열 변수를 역참조하려면 ${array[x]}처럼 중괄호 표기법을 사용하면 된다.


예제) 간단한 배열 사용법
#!/bin/bash

# 배열 멤버들은 인접해 있거나 연속적이지 않아도 됨
# 몇몇 멤버를 초기화되지 않은 채 놔둬도 됨
area[11]=23
area[13]=37
area[51]="UFOs"

echo "area[11] = ${area[11]}"
# area[11] = 23
echo "area[13] = ${area[13]}"
# area[13] = 37
echo "area[51] = ${area[51]}"
# area[51] = UFOs

# 초기화가 안 된 배열 변수는 빈 칸
echo "area[43] = ${area[43]}"
# area[43] =

# 두 배열 변수의 합을 또 다른 배열 변수에 할당
# area[5]=$(expr ${area[11]} + ${area[13]})
area[5]=$((${area[11]} + ${area[13]}))
echo "area[5] = ${area[5]}"
# area[5] = 60

# 문자열에 정수를 더하는 것은 허용되지 않음
area[6]=$((${area[11]} + ${area[51]}))
echo "area[6] = ${area[6]}"
# area[6] = 23

# 배열 변수에 값을 할당하는 다른 방법
area2=("zero" "one" "two" "three" "four")

echo "area2[0] = ${area2[0]}"
# area2[0] = zero
echo "area2[1] = ${area2[1]}"
# area2[1] = one

# 배열 변수에 값을 할당하는 또 다른 방법
area3=([17]="seventeen" [24]="twenty-four")

echo "area3[17] = ${area3[17]}"
# area3[17] = seventeen
echo "area3[24] = ${area3[24]}"
# area3[24] = twenty-four

exit 0


배열 변수는 독특한 문법을 가지고 있고 표준 BASH 연산자들도 배열에 사용할 수 있는 특별한 옵션을 가지고 있다.


#!/bin/bash

array=("zero" "one" "two" "three" "four")

echo "${array[0]}"
# zero
echo ${array:0}
# zero
echo ${array:1}
# ero
echo ${#array}
# 4

exit 0


몇몇 BASH 내장 명령들은 배열 문맥에서 그 의미가 약간 바뀐다. 예를 들어, unset은 배열의 한 요소를 지워주거나 배열 전체를 지워준다.


예제) 배열의 특별한 특성 몇 가지
#!/bin/bash

# "$*"는 모든 ""를 하나의 변수로 해석
# "$@"는 하나의 ""를 하나의 변수로 해석
test=("A" "B C" "D E F")
for i in "${test[*]}"; do
    echo "$i"
done
# A B C D E F

for i in "${test[@]}"; do
    echo "$i"
done
# A
# B C
# D E F

# 크기 지정없이 배열 선언
declare -a colors

echo "좋아하는 색깔을 넣으세요(빈 칸으로 구분)."

read -a colors
# 빨강 주황 노랑 초록 파랑 (입력)

element_count=${#colors[@]}

index=0

# for i in "${colors[@]}"; do
#     echo "$i"
# done
while [ "$index" -lt "$element_count" ]; do
    echo "${colors[$index]}"
    index=$(($index + 1))
done
# 빨강
# 주황
# 노랑
# 초록
# 파랑

# 또는 다음과 같이 출력 가능
echo "${colors[@]}"
# 빨강 주황 노랑 초록 파랑

# "unset" 명령어는 배열 요소를 지워줌
unset colors[1]
echo "${colors[@]}"
# 빨강 노랑 초록 파랑

# "unset" 명령어는 배열 전체를 지워줌
unset colors
echo "${colors[@]}"
#

exit 0


"${array[@]}""${array[*]}"는 배열의 모든 원소를 나타낸다. 배열의 원소 개수를 나타내려면 "${#array[@]}""${#array[*]}"라고 하면 된다. "${#array}"는 배열의 첫 번째 원소인 "${array[0]}"의 길이를 나타낸다.


예제) 빈 배열과 빈 원소
#!/bin/bash

# 빈 배열과 빈 요소를 가진 배열은 다름
array0=("first" "second" "third")
# "array1"은 한 개의 요소를 기지고 있음
array1=("")
# "array2"는 비어 있음
array2=()

echo "array0의 요소들: ${array0[@]}"
echo "array1의 요소들: ${array1[@]}"
echo "array2의 요소들: ${array2[@]}"
# array0의 요소들: first second third
# array1의 요소들:
# array2의 요소들:

echo "array0의 첫 번째 요소 길이 = ${#array0}"
echo "array1의 첫 번째 요소 길이 = ${#array1}"
echo "array2의 첫 번째 요소 길이 = ${#array2}"
# array0의 첫 번째 요소 길이 = 5
# array1의 첫 번째 요소 길이 = 0
# array2의 첫 번째 요소 길이 = 0

echo "array0의 요소 개수 = ${#array0[*]}"
echo "array1의 요소 개수 = ${#array1[*]}"
echo "array2의 요소 개수 = ${#array2[*]}"
# array0의 요소 개수 = 3
# array1의 요소 개수 = 1
# array2의 요소 개수 = 0

exit 0


"${array[@]}""${array[*]}"의 관계는 "$@""$*"와 비슷하다.


#!/bin/bash

array1=("one" "two" "three")
echo "array1 = ${array1[@]}"
# array1 = one two three

# 배열 복사
# array2=("one" "two" "three")와 같음
array2=("${array1[@]}")
echo "array2 = ${array2[@]}"
# array2 = one two three

# 배열에 원소 추가
# array1=("one" "two" "three" "four")와 같음
array1=("${array1[@]}" "four")
echo "array1 = ${array1[@]}"
# array1 = one two three four

# 또는 다음과 같이 인덱스로 추가 가능
# array1[4]="five"와 같음
array1[${#array1[@]}]="five"
echo "array1 = ${array1[@]}"
# array1 = one two three four five

exit 0

References