Bash 어레이 가이드

이 가이드에서는 Bash에서 배열을 선언하고 사용하는 방법을 자세히 알아보겠습니다. 특히, 인덱스 배열과 연관 배열을 다루며, Bash 스크립트에서 데이터를 효율적으로 관리하는 방법을 제시합니다.

Bash에서는 배열을 활용하여 여러 값을 하나의 변수에 저장할 수 있습니다. Bash 배열은 1차원 구조를 가지며, C나 C++와 같은 언어와 달리 동일한 데이터 유형을 강제하지 않습니다. 즉, 하나의 배열에 숫자와 문자열을 혼합하여 저장할 수 있습니다.

이 튜토리얼에서는 Bash 배열을 생성하고, 배열의 개별 요소에 접근하는 방법, 배열 요소를 반복 처리하는 방법, 그리고 배열에 새로운 요소를 추가하는 방법을 배우게 됩니다. 또한, Bash에서 연관 배열을 사용하는 방법도 살펴볼 것입니다. 이제 시작해 볼까요!

⚙ 코딩에 대한 흥미가 있으신가요? 먼저 다음 사항들을 확인해 보세요.

Bash 배열 선언 방법

이 섹션에서는 Bash에서 배열을 선언하는 기본적인 방법과 구문을 실제 예제를 통해 알아보겠습니다.

Bash 배열 선언 구문

Bash에서 배열을 선언하는 기본적인 구문은 다음과 같습니다.

$ 배열이름=(요소1 요소2 ... 요소N)

# 배열이름: 배열의 이름
# 요소1부터 요소N: 배열에 포함될 N개의 요소들

위 구문에서 ‘배열이름’은 사용자가 지정하는 배열의 이름을 나타내며, ‘요소1’부터 ‘요소N’은 배열에 저장될 실제 값들입니다. 배열의 요소들은 괄호 ‘()’ 안에 공백으로 구분하여 나열합니다. 다른 Bash 변수와 마찬가지로, 할당 연산자 ‘=’의 앞뒤에는 공백이 없어야 합니다.

📑 대부분의 다른 프로그래밍 언어에서는 배열 요소를 쉼표로 구분하지만, Bash에서는 공백이 구분자 역할을 합니다.

Bash에서 각 요소가 고유한 인덱스로 식별되는 배열을 인덱스 배열이라고 부릅니다.

Bash 인덱스 배열 선언

간단한 예로, 가격을 나타내는 숫자 배열을 만들어 보겠습니다.

$ 가격들=(24 27 18 30 15)

위에서 ‘가격들’이라는 이름의 배열을 선언하고 괄호 안에 공백으로 구분된 숫자들을 넣어 초기화했습니다. 할당 연산자 ‘=’ 앞뒤에 공백이 없는 것에 주의하세요.

Bash에서는 `echo` 명령어를 사용하여 변수의 값을 출력할 수 있습니다. `$변수이름` 형식을 사용하면 해당 변수에 저장된 값이 출력됩니다. 하지만 배열 이름을 `echo`로 출력하면 첫 번째 요소만 출력되는 것을 확인할 수 있습니다.

$ echo $가격들
24

Bash 배열은 0부터 시작하는 제로-인덱싱 방식을 따릅니다. 즉, 첫 번째 요소의 인덱스는 0이고, 두 번째 요소의 인덱스는 1입니다. 음수 인덱싱도 지원하며, 마지막 요소의 인덱스는 -1입니다.

특정 인덱스에 있는 요소를 출력하고 싶을 때는 어떻게 해야 할까요? 인덱스 1에 있는 요소를 출력해 보겠습니다.

$ echo $가격들[1]
24[1]

결과가 왜 ’24[1]’일까요? Bash는 `$가격들`을 배열의 첫 번째 요소인 24로 대체하고, `[1]`은 문자열 그대로 출력하기 때문입니다.

특정 인덱스의 요소를 제대로 출력하려면 `${가격들[인덱스]}` 형태의 매개변수 확장을 사용해야 합니다.

$ echo ${가격들[1]}
# 27
$ echo ${가격들[2]}
# 18

배열의 모든 요소를 한 번에 출력하려면 인덱스 대신 `@` 기호를 사용할 수 있습니다.

$ echo ${가격들[@]}
24 27 18 30 15

이번에는 문자열 배열을 만들어 보겠습니다. 다음 명령을 실행하면 인덱스 배열이 생성됩니다.

$ declare -a 과일

‘-a’ 옵션은 인덱스 배열을 선언하는 역할을 합니다. 이제 다음과 같이 특정 인덱스에 요소를 할당하여 배열을 채울 수 있습니다.

$ 과일[0]="체리"
$ 과일[1]="딸기"
$ 과일[2]="사과"
$ 과일[3]="배"
$ 과일[4]="멜론"
$ 과일[5]="오렌지"

배열의 모든 요소를 출력하려면 `${과일[@]}`를 사용하면 됩니다.

$ echo ${과일[@]}
체리 딸기 사과 배 멜론 오렌지

Bash 배열 요소에 접근

배열의 요소에 접근하는 방법은 다음과 같습니다.

  • 배열을 순회하며 각 요소에 직접 접근
  • 인덱스를 사용하여 요소에 접근

배열 순회 및 요소 접근

Python을 사용해 본 경험이 있다면, 다음과 같은 `for` 루프를 사용했을 것입니다.

for 요소 in 어떤_리스트:
    print(요소)

위 `for` 루프와 동일한 동작을 하는 Bash 스크립트를 작성해 보겠습니다.

${가격들[@]}는 `가격들` 배열의 모든 요소로 확장되고, `${가격들[@]}`는 배열의 모든 값들을 제공합니다.

Bash의 `for` 루프는 Python의 `for` 루프와 구문이 비슷하지만, 루프 본문의 명령어는 `do`와 `done`으로 묶어야 합니다.

$ for 가격 in ${가격들[@]}
> do
> echo $가격
> done

위 코드는 `echo` 명령을 사용하여 `가격` 변수의 값을 출력하므로 다음과 같은 결과가 출력됩니다.

# 출력 결과
24
27
18
30
15

인덱스를 사용하여 요소에 접근

배열을 순회하는 또 다른 방법은 요소의 인덱스를 사용하는 것입니다. 이는 Python의 `for` 루프에서 `range()` 함수를 사용하는 것과 유사합니다.

for i in range(len(어떤_리스트)):
    print(i)

순회할 인덱스 목록을 얻으려면 매개변수 확장에서 배열 이름 앞에 느낌표(!)를 추가하면 됩니다. 이렇게 하면 배열의 모든 유효한 인덱스 목록을 얻을 수 있습니다.

$ echo ${!가격들[@]}
0 1 2 3 4

`가격들` 배열에는 5개의 요소가 있으므로 인덱스는 0부터 시작하여 4까지 증가합니다.

이제 인덱스 목록을 순회하며 각 인덱스에 해당하는 요소에 접근할 수 있습니다. 인덱스 i에 대한 요소는 `${가격들[i]}`로 표현됩니다.

$ for i in ${!가격들[@]}
> do
> echo ${가격들[i]}
> done

위 루프는 배열의 모든 요소를 출력합니다.

# 출력 결과
24
27
18
30
15

💬 여기서는 각 요소에 접근하여 단순히 값을 출력하는 간단한 작업을 수행했습니다. 하지만 실제로는 요소에 대해 다양한 유효한 처리를 수행할 수 있습니다.

Bash 배열에 요소 추가

`가격들` 배열은 현재 5개의 요소(인덱스 0, 1, 2, 3, 4)를 가지고 있습니다. 인덱스 5 위치에 요소를 추가하려면 다음과 같이 할 수 있습니다.

$ 가격들[5]=21

이제 `가격들` 배열의 끝에 21이 추가된 것을 볼 수 있습니다.

$ echo ${가격들[@]}
24 27 18 30 15 21

하지만 배열의 마지막 요소의 인덱스나 배열에 현재 몇 개의 요소가 있는지 기억하지 않고도 배열의 끝에 요소를 추가하는 것이 더 편리합니다.

`배열이름+=(요소(들))` 구문을 사용하여 하나 이상의 요소를 배열에 추가할 수 있습니다.

$ 가격들+=(10)

이제 `가격들` 배열을 출력하면 배열의 끝에 10이 추가된 것을 확인할 수 있습니다.

$ echo ${가격들[@]}
24 27 18 30 15 21 10

다음으로 Bash에서 연관 배열을 선언하는 방법을 알아보겠습니다.

Bash 연관 배열

키-값 쌍으로 관계를 정의하고 싶다면 연관 배열을 사용할 수 있습니다. 연관 배열은 다음 일반 구문을 사용하여 선언할 수 있습니다. `-a` 대신 `-A` 옵션을 사용합니다.

$ declare -A 과일_가격

키와 해당 값을 지정하여 연관 배열에 요소를 추가할 수 있습니다. 여기서는 과일 이름을 키로, `가격들` 배열의 숫자를 값으로 추가했습니다.

$ 과일_가격[체리]=24
$ 과일_가격[딸기]=27
$ 과일_가격[사과]=18
$ 과일_가격[배]=30
$ 과일_가격[멜론]=15
$ 과일_가격[오렌지]=21

그렇다면 연관 배열의 요소에는 어떻게 접근할까요?

Python 딕셔너리에서 키를 사용하여 값을 조회하는 것처럼 키를 사용하여 연관 배열의 값에 접근할 수 있습니다.

$ echo ${과일_가격[딸기]}
# 27

${과일_가격[@]}는 값으로 확장되고, ${!과일_가격[@]}는 키로 확장됩니다.

$ echo ${과일_가격[@]}
# 출력 결과: 18 27 21 24 30 15
$ echo ${!과일_가격[@]}
# 출력 결과: 사과 딸기 오렌지 체리 배 멜론

주의: 요소의 순서는 요소를 추가한 순서와 다를 수 있습니다. 인덱스 배열과는 달리, 연관 배열은 정렬된 컬렉션이 아니기 때문입니다. 연관 배열은 키와 값 사이의 연결을 기반으로 작동합니다. 따라서 키는 연관 배열을 인덱싱하고, 인덱스는 배열을 인덱싱합니다.

다음과 같이 연관 배열을 순회하고 키에 접근할 수도 있습니다.

$ for 키 in ${!과일_가격[@]}
> do
> echo $키
> done
# 출력 결과
사과
딸기
오렌지
체리
배
멜론

다음 루프는 값에 접근하는 방법을 보여줍니다.

$ for 값 in ${과일_가격[@]}
> do
> echo $값
> done
# 출력 결과
18
27
21
24
30
15

`배열이름[키]=값` 형태 외에도, 다음과 같이 시퀀스 방식으로 선언할 수도 있습니다.

declare -A 배열이름
배열이름=(키1 값1 키2 값2 ... 키N 값N)

이 방식으로 선언하면, Bash는 첫 번째 요소를 첫 번째 키로, 두 번째 요소를 첫 번째 값으로 추론합니다.

요약

이제 Bash 배열을 생성하고 사용하는 방법을 이해하셨기를 바랍니다. 다음은 배운 내용을 간략하게 요약한 것입니다.

  • `배열이름=(요소1 요소2 요소3 … 요소N)` 구문을 사용하여 Bash에서 인덱스 배열을 선언하거나 `declare -a 배열이름`을 실행한 다음 요소를 추가할 수 있습니다.
  • 요소에 접근하려면 `${배열이름[@]}`을 사용하여 순회할 수 있습니다. 또는 `${!배열이름[@]}` 매개변수 확장을 사용하여 모든 유효한 인덱스 목록을 얻을 수도 있습니다.
  • 마지막으로 Bash에서 키-값 쌍을 저장하기 위해 연관 배열을 선언하는 방법도 배웠습니다.

다음으로 Bash의 루프에 대한 튜토리얼을 확인해 보세요.