앞서 Bash에서 변수를 사용하는 기본적인 방법을 소개한 적이 있습니다. 이번 글에서는 한 단계 더 나아가 Bash 배열(array) 변수의 개념과 사용 방법을 실제 예제와 함께 자세히 살펴보겠습니다.
배열이란 무엇인가?
배열은 여러 개의 값을 하나의 변수에 담을 수 있는 변수 유형입니다. 값들의 목록이라고 생각하면 되며, 반복문을 사용해 목록을 순회하면서 각 개별 값에 대해 원하는 작업을 수행할 수 있습니다.
예를 들어, 여러 파일에 동일한 작업을 적용하고 싶다고 가정해 봅시다. 파일 목록을 배열로 저장해 두면 반복문으로 파일 이름을 하나씩 꺼내면서 각 파일에 작업을 수행할 수 있습니다.
배열은 인덱스(index)로 관리되며, 각 항목의 위치는 0부터 시작하는 숫자로 표현됩니다.
흥미로운 점은 Bash 배열의 요소가 반드시 연속적일 필요가 없다는 것입니다. 즉, 인덱스 사이에 빈틈이 있어도 됩니다. 예를 들어 인덱스 0, 3, 17에만 값이 있고 그 사이 인덱스는 비어 있는 배열도 얼마든지 만들 수 있습니다.
Bash 배열에 대해 더 깊이 알고 싶다면 Linux Documentation Project의 문서를 참고하는 것도 좋은 방법입니다.
Bash 배열 생성하기
Bash 배열에는 경로, 문자열, 숫자 등 어떤 유형의 Bash 변수든 담을 수 있고, 심지어 다른 배열까지도 포함할 수 있습니다.
참고로, 셸 스크립트에서 파일 경로는 반드시 문자열(따옴표)로 감싸는 것이 안전합니다. 경로에 공백이나 특수문자가 포함되어 있을 때 발생할 수 있는 오류를 예방할 수 있습니다.
배열을 선언하는 방법은 크게 세 가지가 있습니다. 아래에서 하나씩 살펴보겠습니다.
1. 간접 선언(Indirect Declaration)
배열 요소에 직접 값을 할당하면 배열이 자동으로 생성됩니다. 별도의 선언 과정 없이 값 할당만으로 배열과 요소가 함께 만들어지는 방식입니다.
ARRAYNAME[INDEX]=VALUE
예제:
#!/bin/bash peopleArray[3]="Tom"
위 코드에서는 peopleArray 배열의 인덱스 3에 "Tom"이라는 값이 할당되면서, peopleArray 배열이 자동으로(간접적으로) 생성됩니다.
2. 직접 선언(Direct Declaration)
declare 명령어를 사용해 배열임을 명시적으로 선언할 수도 있습니다.
declare -a ARRAYNAME
예제:
declare -a peopleArray
이렇게 하면 peopleArray라는 이름의 빈 배열이 생성됩니다. 이후에 값을 하나씩 채워 넣으면 됩니다.
3. 복합 할당(Compound Assignment)
실무에서 가장 많이 사용되는 방법입니다. 배열을 생성하는 동시에 초기값들을 한 번에 할당할 수 있습니다.
ARRAYNAME=(value1 value2 ...)
변수 이름에 괄호 ()로 묶은 값들을 할당하며, 각 값은 공백으로 구분합니다. 공백이 포함된 값은 반드시 따옴표로 묶어 주세요.
예제:
peopleArray=("Tom" "Bill" "Theodore Baker Sr.")
배열에 값 할당하기
배열 끝에 새 값 추가하기
기존 배열 맨 뒤에 새 값을 추가하려면 += 연산자를 사용합니다.
peopleArray+=("Tony")
이렇게 하면 기존 요소들은 그대로 유지된 채 "Tony"가 배열의 마지막에 추가됩니다.
배열의 값 교체하기
특정 값을 다른 값으로 바꾸려면 해당 값이 저장된 인덱스에 새 값을 덮어쓰면 됩니다.
예를 들어, 인덱스 7에 있는 값을 교체하고 싶다면 다음과 같이 작성합니다.
peopleArray[7]="Tony"
배열에서 값 삭제하기
unset 명령어에 삭제할 요소의 인덱스를 지정하면 해당 값을 배열에서 제거할 수 있습니다.
unset ARRAYNAME[INDEX]
예제:
unset peopleArray[1]
이 명령을 실행하면 peopleArray 배열의 두 번째 값(인덱스 1)이 삭제됩니다.
배열 값에 접근하기
배열의 특정 값에 접근할 때는 반드시 중괄호 { }를 사용해야 합니다. 중괄호를 생략하면 Bash가 대괄호 안의 인덱스를 올바르게 해석하지 못해 엉뚱한 결과가 출력됩니다.
echo ${ARRAYNAME[INDEX]}
예제:
#!/bin/bash
peopleArray=("Tom" "Bill" "Theodore Baker Sr.")
echo ${peopleArray[0]}
실행 결과:
Tom
반면 마지막 줄을 다음과 같이 중괄호 없이 작성하면,
echo $peopleArray[0]
"Tom[0]"처럼 첫 번째 요소 뒤에 "[0]"이 문자 그대로 붙어서 출력되므로 주의해야 합니다.
배열 반복 처리하기
배열을 활용하는 가장 일반적인 패턴은 반복문으로 전체 요소를 순회하면서 각 요소에 작업을 수행하는 것입니다. 다음은 for 반복문으로 배열의 모든 요소를 출력하는 기본 예제입니다.
#!/bin/bash
peopleArray=("Tom" "Bill" "Theodore Baker Sr.")
for person in "${peopleArray[@]}"; do
echo "$person"
done
이처럼 Bash 배열을 제대로 활용하면 여러 값을 손쉽게 관리할 수 있고, 스크립트를 훨씬 더 유연하고 효율적으로 작성할 수 있습니다.