본문 바로가기
C.W.K.
Stream
Lesson 08 of 12 · published

배열

~10 min · arrays, indexed, associative

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

bash와 zsh의 인덱스 배열

files=("a.txt" "b.txt" "c.txt")
echo "${files[0]}"        # bash에서는 a.txt, zsh 기본 설정에서는 빈 값
echo "${files[@]}"        # 모든 원소
echo "${#files[@]}"       # 개수: 3
files+=("d.txt")          # 배열 뒤에 추가
unset 'files[1]'           # b.txt 슬롯 제거

bash의 인덱스 배열은 보통 0부터 시작하고, zsh는 기본 설정에서 1부터 시작해. 문법이 비슷하다고 같은 의미라고 가정하면 경계에서 틀려. 배열을 쓰는 스크립트는 shebang으로 셸을 하나 정해.

반복

for f in "${files[@]}"; do
  echo "$f"
done

# 인덱스도 함께
for i in "${!files[@]}"; do
  echo "$i: ${files[i]}"
done

bash 4 이상과 zsh의 연관 배열

declare -A user
user[name]="Alice"
user[age]=24
for k in "${!user[@]}"; do
  echo "$k = ${user[$k]}"
done

macOS에 기본 포함된 bash 3.2에는 연관 배열이 없어. 그 기능이 필요하면 새 bash나 zsh로 실행 환경을 명확히 고정해. 서로 대응하는 인덱스 배열 두 개로 흉내 내는 방법은 값이 어긋나기 쉬워 마지막 수단에 가까워.

명령 결과를 배열로

readarray -t lines < ~/.zshrc        # bash 4 이상
lines=("${(@f)$(< ~/.zshrc)}")             # zsh
files=(*.txt)                              # 글로브 결과를 배열로 저장

배열의 일부 범위 꺼내기

echo "${files[@]:1:2}"   # 인덱스 1부터 원소 2개
echo "${files[@]: -1}"   # 마지막 원소 (공백 주의)

배열은 공백으로 붙인 문자열이 아니야

파일 경로나 사용자 입력 여러 개를 다룰 때 배열은 각 값의 경계를 보존해. items="$a $b"처럼 합쳐 두었다가 다시 나누면 원래 공백이 데이터였는지 구분할 수 없어. 처음부터 배열에 넣고 "${items[@]}"로 전달해.

셸을 넘나드는 순간 직렬화가 필요해

bash 배열을 환경 변수로 export해서 자식 셸에 그대로 넘길 수는 없어. 프로세스 경계를 건널 때는 인자를 여러 개로 전달하거나, 줄·NUL·JSON처럼 명시한 형식으로 직렬화해. ‘배열 문법이 비슷하다’와 ‘데이터 계약이 같다’는 전혀 다른 말이야.

Code

실전 배열 흐름·bash
#!/usr/bin/env bash
set -euo pipefail
todos=()
while IFS= read -r line; do
  [[ "$line" =~ ^TODO ]] && todos+=("$line")
done < notes.md
echo "${#todos[@]} TODO lines"
printf '  - %s\n' "${todos[@]}"

External links

Exercise

bash 스크립트에 arr=(a b c d)를 선언하고 "${arr[@]}", "${arr[*]}", "${arr[1]}", "${#arr[@]}"를 각각 출력해. 인자 경계, 인덱스와 원소 수가 어떻게 다른지 printf '<%s>\n'으로 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.