인덱스 배열
인덱스 배열은 0번부터 시작하는 번호로 각 요소에 접근합니다. C나 Java의 배열과 비슷한 개념이지만, Bash 배열은 크기를 미리 선언할 필요가 없고 자유롭게 늘어납니다. 인덱스도 연속적일 필요가 없습니다. 0번과 5번만 있어도 됩니다.
배열 선언
배열을 선언하는 방법은 두 가지입니다.
# 방법 1: 괄호로 여러 값을 한 번에 할당fruits=("apple" "banana" "cherry")# 방법 2: 인덱스를 지정해서 개별 할당arr[0]="first"arr[1]="second"arr[5]="sixth" # 인덱스가 연속적이지 않아도 됨# declare -a로 명시적 선언 (선택적)declare -a numbersnumbers=(10 20 30 40 50)
값에 공백이 없으면 따옴표를 생략할 수 있습니다. 하지만 공백이 포함된 값은 반드시 따옴표로 감싸야 합니다.
words=("hello world" "foo bar" "baz") # 공백 포함 — 따옴표 필수
요소 접근
배열 요소에 접근할 때는 ${arr[인덱스]} 형태를 씁니다. 중괄호가 반드시 필요합니다. $arr[0]처럼 쓰면 $arr(배열 첫 번째 요소)에 [0]을 문자로 붙인 결과가 나옵니다.
fruits=("apple" "banana" "cherry")echo "${fruits[0]}" # appleecho "${fruits[1]}" # bananaecho "${fruits[2]}" # cherryecho "${fruits[-1]}" # cherry (음수 인덱스: 뒤에서부터)echo "${fruits[-2]}" # banana# 전체 요소 출력echo "${fruits[@]}" # apple banana cherryecho "${fruits[*]}" # apple banana cherry (큰따옴표 안에서 차이 있음)# 요소 개수echo "${#fruits[@]}" # 3
"${fruits[@]}"와 "${fruits[*]}"는 큰따옴표로 감쌌을 때 동작이 다릅니다. "${fruits[@]}"는 각 요소를 별도 인수로 전달하고, "${fruits[*]}"는 모든 요소를 공백으로 이어 하나의 문자열로 만듭니다. 공백이 포함된 요소를 다룰 때는 "${fruits[@]}"가 안전합니다.
요소 추가와 삭제
fruits=("apple" "banana")# 요소 추가fruits+=("cherry") # 마지막에 추가fruits+=("date" "fig") # 여러 개 추가echo "${fruits[@]}" # apple banana cherry date figecho "${#fruits[@]}" # 5# 특정 인덱스에 직접 할당fruits[10]="grape" # 인덱스 10에 할당 (6~9는 비어있음)# 요소 삭제unset fruits[1] # banana 삭제 (해당 인덱스가 비어짐)echo "${fruits[@]}" # apple cherry date fig grapeecho "${#fruits[@]}" # 5 (인덱스 비어도 개수는 실제 요소 수)
unset으로 요소를 삭제하면 해당 인덱스가 비어지고 나머지 인덱스는 재정렬되지 않습니다. 연속적인 인덱스가 필요하다면 배열을 새로 만들어야 합니다.
배열 슬라이싱
배열의 일부를 잘라서 가져올 수 있습니다. ${arr[@]:시작:개수} 형태입니다.
nums=(10 20 30 40 50 60 70)echo "${nums[@]:2:3}" # 30 40 50 (2번 인덱스부터 3개)echo "${nums[@]:4}" # 50 60 70 (4번 인덱스부터 끝까지)echo "${nums[@]: -3}" # 50 60 70 (뒤에서 3개, 공백 주의)
슬라이싱한 결과도 배열로 받을 수 있습니다.
slice=("${nums[@]:2:3}")echo "${slice[@]}" # 30 40 50echo "${#slice[@]}" # 3
실습: 요일 배열로 오늘 요일 출력 스크립트
#!/bin/bash# 새 파일: weekday.sh# 요일 배열 (0 = 일요일)days=("일요일" "월요일" "화요일" "수요일" "목요일" "금요일" "토요일")# date +%w : 요일 번호 (0=일, 6=토)today_num=$(date +%w)today_name="${days[$today_num]}"echo "오늘은 $today_name 입니다."# 이번 주 전체 출력echo ""echo "=== 이번 주 요일 ==="for (( i = 0; i < ${#days[@]}; i++ )); do if (( i == today_num )); then echo " [$i] ${days[$i]} ← 오늘" else echo " [$i] ${days[$i]}" fidone# 슬라이싱: 평일만echo ""echo "=== 평일 (월~금) ==="weekdays=("${days[@]:1:5}")for day in "${weekdays[@]}"; do echo " $day"doneexit 0
실행 결과는 다음과 같습니다 (목요일에 실행 시).
오늘은 목요일 입니다.
=== 이번 주 요일 ===
[0] 일요일
[1] 월요일
[2] 화요일
[3] 수요일
[4] 목요일 ← 오늘
[5] 금요일
[6] 토요일
=== 평일 (월~금) ===
월요일
화요일
수요일
목요일
금요일
"${days[@]:1:5}"로 인덱스 1번(월요일)부터 5개를 잘라 평일 배열을 만들었습니다. 배열 슬라이싱을 이용하면 원본 배열을 수정하지 않고 필요한 부분만 꺼내 쓸 수 있습니다.