소개
프로그래밍에서는 파일 이름, 사용자 ID, 서버 이름처럼 서로 관련된 항목의 목록을 저장해야 하는 경우가 많습니다. 각 항목마다 file1, file2, file3처럼 별도의 변수를 만드는 대신, **배열 (Array)**이라는 하나의 변수를 사용할 수 있습니다.
배열을 사용하면 하나의 이름으로 여러 값을 저장할 수 있습니다. 항목을 추가하고, 삭제하고, 조회할 수 있는 목록이라고 생각하면 됩니다.
변수 하나만으로는 부족해지는 순간 배열이 유용합니다. 서버 목록, 파일 이름, 패키지 이름, 사용자 계정은 한 번에 하나의 값이 아니라 그룹으로 다루는 것이 자연스러운 데이터의 예입니다.
이 실습에서는 다음 방법을 배웁니다.
- 초기 값으로 배열을 선언합니다.
- 배열에 새 항목을 추가합니다.
- 배열의 모든 요소를 출력합니다.
- 배열을 순회하면서 각 항목을 개별적으로 처리합니다.
배열 선언
먼저 이름 목록을 저장하는 스크립트를 만듭니다.
배열은 관련된 값을 여러 개의 변수에 흩어 놓지 않고 하나의 그룹으로 다루는 셸의 방법입니다. 스크립트에서 단일 항목이 아니라 여러 항목으로 구성된 모음을 처리해야 할 때 유용합니다.
array_lab.sh 스크립트를 만듭니다.
cd ~/project
nano array_lab.sh
다음 코드를 입력해 배열을 초기화합니다.
#!/bin/bash
## Define an array named 'names'
names=("Alice" "Bob")
문법 규칙:
- 괄호
()안에 값 목록을 작성합니다. - 항목은 쉼표가 아니라 공백으로 구분합니다.
("Alice" "Bob")는 올바른 형식입니다.("Alice", "Bob")는 잘못된 형식입니다. 쉼표가 문자열"Alice,"의 일부로 처리되기 때문입니다.
마지막 규칙은 셸의 더 일반적인 특징을 보여 줍니다. Bash 문법은 단순해 보이지만, 작은 구두점 차이로 의미가 달라질 수 있습니다. 배열은 일부 다른 언어처럼 쉼표로 구분하는 목록이 아니라 공백으로 구분하는 목록입니다.
저장하려면 Ctrl+O를 누르고, 종료하려면 Ctrl+X를 누릅니다.
파일 내용을 확인합니다.
cat array_lab.sh
이제 배열 변수를 성공적으로 정의했습니다. 아직 스크립트가 출력하는 내용은 없습니다.
배열에 요소 추가
목록에 들어갈 모든 항목을 처음부터 알 수 없는 경우가 많습니다. 스크립트가 실행되는 동안 항목을 동적으로 추가해야 할 수도 있습니다.
실제 스크립트에서 흔히 사용하는 방식입니다. 실행 중에 찾은 조건에 맞는 파일, 활성 호스트, 장애가 발생한 서비스 또는 패키지 이름으로 배열을 구성할 수 있습니다.
+= 연산자를 사용하면 배열의 끝에 새 항목을 추가할 수 있습니다.
스크립트를 엽니다.
nano array_lab.sh
파일 맨 아래에 다음 줄을 추가합니다.
## Append 'Charlie' to the list
names+=("Charlie")
설명:
+=는 기존 값에 새 값을 추가한다는 뜻입니다.("Charlie")는 새 항목을 괄호로 감싸 배열 요소로 처리되도록 합니다.
이제 파일 전체가 다음과 같아야 합니다.
#!/bin/bash
## Define an array named 'names'
names=("Alice" "Bob")
## Append 'Charlie' to the list
names+=("Charlie")
저장하고 종료합니다.
모든 요소 출력
배열에 예상한 모든 항목이 들어 있는지 확인하려면 배열의 모든 요소를 한 번에 출력할 수 있습니다.
Bash 에서는 배열 변수를 일반 변수와 조금 다르게 조회합니다. 모든 요소를 확장하려면 ${array_name[@]}을 사용합니다.
@는 모든 요소를 나타내는 와일드카드 역할을 하는 특수 기호입니다.
${...} 형식은 매개변수 확장의 또 다른 예입니다. Bash 는 변수 이름을 그대로 출력하지 않습니다. echo가 최종 텍스트를 처리하기 전에 배열을 저장된 요소로 확장합니다.
array_lab.sh를 엽니다.
nano array_lab.sh
다음 출력 명령을 추가합니다.
## Print all elements in the array
echo "All Names: ${names[@]}"
저장하고 종료합니다.
스크립트에 실행 권한을 부여하고 실행합니다.
chmod +x array_lab.sh
./array_lab.sh
결과:
All Names: Alice Bob Charlie
${names[@]} 문법이 배열의 모든 항목을 공백으로 구분된 목록으로 확장했습니다.
배열 순회
전체 목록을 출력하는 방법은 디버깅에 유용하지만, 일반적으로는 각 항목을 개별적으로 처리해야 합니다. 예를 들어 목록의 각 이름에 대해 사용자 계정을 만들 수 있습니다.
이 작업에는 for 반복문을 사용합니다.
array_lab.sh를 엽니다.
nano array_lab.sh
파일 끝에 다음 반복문을 추가합니다.
echo "--- Processing Names ---"
## Loop through each item in the array
for name in "${names[@]}"; do
echo "Hello, $name"
done
이제 전체 스크립트가 다음과 같아야 합니다.
#!/bin/bash
names=("Alice" "Bob")
names+=("Charlie")
echo "All Names: ${names[@]}"
echo "--- Processing Names ---"
for name in "${names[@]}"; do
echo "Hello, $name"
done
저장하고 종료합니다. 스크립트를 실행합니다.
./array_lab.sh
결과:
"${names[@]}"처럼 따옴표로 감싸는 것도 중요합니다. 이렇게 하면 각 배열 요소가 하나의 항목으로 유지됩니다. 요소의 값에 공백이 포함될 때 특히 중요합니다. 실제 스크립트에서는 파일 이름과 인수가 항상 한 단어로만 구성되지 않으므로 이 세부 사항이 더 중요해집니다.
All Names: Alice Bob Charlie
--- Processing Names ---
Hello, Alice
Hello, Bob
Hello, Charlie
반복문은 배열에서 각 이름을 가져와 변수 name에 할당한 다음 코드 블록을 실행했습니다. Bash 에서 목록을 처리할 때 가장 일반적으로 사용하는 방법입니다.
요약
이 실습에서는 Bash 배열 사용의 기본을 배웠습니다.
- 선언 (
name=(...)): 초기 값으로 목록을 만듭니다. - 추가 (
+=): 기존 배열에 새 항목을 동적으로 추가합니다. - 확장 (
${name[@]}): 배열의 모든 항목을 가져옵니다. - 순회 (
for): 목록의 각 항목을 하나씩 처리합니다.
배열은 여러 파일, 사용자 또는 데이터 항목을 효율적으로 처리하는 스크립트를 작성할 때 필수적입니다.



