2025년 6월 26일 작성

Shell Script에서 배열 사용하는 방법

shell script에서는 각 요소를 공백이나 줄바꿈으로 구분하여 배열을 선언할 수 있습니다.

Shell Script에서 배열 사용하기

  • 다른 programming language와 마찬가지로 shell script에서도 배열을 사용하여 data를 관리할 수 있습니다.
  • 배열 선언, 요소 접근, 반복문 처리 등 다양한 방법으로 배열을 활용할 수 있습니다.

배열 선언 방법

  • shell script에서 배열을 선언하는 방법은 여러 가지가 있으며, 각각 다른 상황에서 활용됩니다.

기본 배열 선언

  • 소괄호를 사용하여 배열을 선언하고 공백으로 요소를 구분합니다.
# 문자열 배열 선언
fruits=("apple" "banana" "orange" "grape")

# 숫자 배열 선언  
numbers=(1 2 3 4 5)

# 혼합 배열 선언
mixed=("hello" 42 "world" 3.14)

개별 요소 할당

  • 배열의 특정 index에 개별적으로 값을 할당할 수 있습니다.
# 빈 배열 선언 후 개별 할당
colors=()
colors[0]="red"
colors[1]="green" 
colors[2]="blue"

# 또는 직접 index 지정
animals[0]="cat"
animals[1]="dog"
animals[2]="bird"

명령어 결과를 배열로 변환

  • command의 실행 결과를 배열로 변환하여 저장할 수 있습니다.
# file 배열을 배열로 저장
files=($(ls *.txt))

# 현재 directory의 모든 file을 배열로 저장
all_files=(*)

# command 결과를 배열로 저장
users=($(cut -d: -f1 /etc/passwd))

배열 요소 접근 방법

  • 배열의 요소에 직접 접근할 수 있습니다.

개별 요소 접근

  • 중괄호와 대괄호를 사용하여 특정 index의 요소에 접근합니다.
fruits=("apple" "banana" "orange")

# 첫 번째 요소 (index 0)
echo ${fruits[0]}  # apple

# 두 번째 요소 (index 1)  
echo ${fruits[1]}  # banana

# 마지막 요소
echo ${fruits[-1]}  # orange (bash 4.3+)

전체 배열 접근

  • 배열의 모든 요소에 한 번에 접근할 수 있습니다.
fruits=("apple" "banana" "orange")

# 모든 요소 출력 (각 요소가 분리됨)
echo ${fruits[@]}  # apple banana orange

# 모든 요소 출력 (하나의 문자열로 결합)
echo ${fruits[*]}  # apple banana orange

# 모든 요소를 따옴표로 보호하여 출력
echo "${fruits[@]}"  # "apple" "banana" "orange"

부분 배열 추출

  • 배열의 특정 범위만을 추출할 수 있습니다.
numbers=(1 2 3 4 5 6 7 8 9 10)

# index 2부터 3개 요소 추출
echo ${numbers[@]:2:3}  # 3 4 5

# index 5부터 끝까지 추출  
echo ${numbers[@]:5}    # 6 7 8 9 10

배열 정보 확인

  • 배열의 크기, index, 요소 존재 여부 등을 확인할 수 있습니다.

배열 크기 확인

  • 배열에 포함된 요소의 개수를 확인합니다.
fruits=("apple" "banana" "orange")

# 배열 크기 확인
echo ${#fruits[@]}  # 3

# 특정 요소의 길이 확인
echo ${#fruits[0]}  # 5 (apple의 글자 수)

배열 index 확인

  • 배열에서 사용 중인 모든 index를 확인할 수 있습니다.
sparse_array=()
sparse_array[0]="first"
sparse_array[5]="sixth"
sparse_array[10]="eleventh"

# 사용 중인 index 확인
echo ${!sparse_array[@]}  # 0 5 10

배열 반복 처리

  • 반복문을 사용하여 배열의 요소를 순회하고 처리할 수 있습니다.

for 반복문으로 요소 순회

  • 배열의 모든 요소를 순차적으로 처리합니다.
fruits=("apple" "banana" "orange")

# 요소 값으로 순회
for fruit in "${fruits[@]}"; do
    echo "Fruit: $fruit"
done

# index로 순회
for i in "${!fruits[@]}"; do
    echo "Index $i: ${fruits[$i]}"
done

while 반복문 사용

  • while 반복문을 사용하여 배열을 처리할 수 있습니다.
numbers=(1 2 3 4 5)
i=0

while [ $i -lt ${#numbers[@]} ]; do
    echo "Number at index $i: ${numbers[$i]}"
    ((i++))
done

연관 배열 사용

  • bash 4.0 이상에서는 연관 배열(associative array)을 지원합니다.

연관 배열 선언

  • declare -A 명령어를 사용하여 연관 배열을 선언합니다.
# 연관 배열 선언
declare -A person

# 값 할당
person["name"]="John"
person["age"]="30"  
person["city"]="Seoul"

# 또는 선언과 동시에 초기화
declare -A colors=(["red"]="#FF0000" ["green"]="#00FF00" ["blue"]="#0000FF")

연관 배열 접근

  • 문자열 key를 사용하여 연관 배열의 값에 접근합니다.
declare -A person=(["name"]="John" ["age"]="30" ["city"]="Seoul")

# 개별 값 접근
echo ${person["name"]}  # John
echo ${person["age"]}   # 30

# 모든 값 출력
echo ${person[@]}       # John 30 Seoul

# 모든 key 출력  
echo ${!person[@]}      # name age city

실용적인 활용 예제

  • shell script의 배열은 실무에서 다양하게 활용할 수 있습니다.

File 처리 예제

  • 특정 확장자의 file들을 배열로 관리하고 처리합니다.
#!/bin/bash

# .txt file들을 배열로 저장
text_files=(*.txt)

if [ ${#text_files[@]} -eq 0 ]; then
    echo "No .txt files found"
    exit 1
fi

# 각 file 처리
for file in "${text_files[@]}"; do
    echo "Processing: $file"
    wc -l "$file"
done

설정 관리 예제

  • 연관 배열을 사용하여 application 설정을 관리합니다.
#!/bin/bash

# 설정 정보를 연관 배열로 관리
declare -A config
config["database_host"]="localhost"
config["database_port"]="5432"
config["database_name"]="myapp"
config["log_level"]="INFO"

# 설정 출력 함수
print_config() {
    echo "=== Application Configuration ==="
    for key in "${!config[@]}"; do
        echo "$key: ${config[$key]}"
    done
}

# 설정 값 검증 함수
validate_config() {
    required_keys=("database_host" "database_port" "database_name")
    
    for key in "${required_keys[@]}"; do
        if [[ -z "${config[$key]}" ]]; then
            echo "Error: Missing required configuration: $key"
            return 1
        fi
    done
    
    return 0
}

print_config
validate_config

명령어 실행 관리 예제

  • 여러 명령어를 배열로 관리하고 순차적으로 실행합니다.
#!/bin/bash

# 실행할 명령어들을 배열로 정의
commands=(
    "echo 'Starting deployment...'"
    "git pull origin main"
    "npm install"
    "npm run build"
    "systemctl restart myapp"
    "echo 'Deployment completed!'"
)

# 각 명령어 실행
for i in "${!commands[@]}"; do
    echo "Step $((i+1)): ${commands[$i]}"
    
    if eval "${commands[$i]}"; then
        echo "✓ Step $((i+1)) completed successfully"
    else
        echo "✗ Step $((i+1)) failed"
        exit 1
    fi
    
    echo "---"
done

주의 사항

  • shell script에서 배열을 사용할 때 주의해야 할 점들이 있습니다.

공백이 포함된 요소 처리

  • 배열 요소에 공백이 포함된 경우 따옴표로 보호해야 합니다.
# 올바른 방법
files=("file with spaces.txt" "another file.doc" "normal.txt")

# 요소 접근 시 따옴표 사용
for file in "${files[@]}"; do
    echo "Processing: $file"
done

Bash Version 호환성

  • 연관 배열은 bash 4.0 이상에서만 지원됩니다.
# bash version 확인
if [ "${BASH_VERSINFO[0]}" -lt 4 ]; then
    echo "This script requires bash 4.0 or higher"
    exit 1
fi

declare -A my_array

전역 변수와 지역 변수

  • 함수 내에서 배열을 사용할 때는 scope에 주의해야 합니다.
# 전역 배열
global_array=("a" "b" "c")

process_array() {
    # 지역 배열 선언
    local local_array=("x" "y" "z")
    
    # 전역 배열 수정
    global_array+=("d")
    
    echo "Local: ${local_array[@]}"
    echo "Global: ${global_array[@]}"
}

process_array
echo "After function: ${global_array[@]}"

목차