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]}"
donebash 4 이상과 zsh의 연관 배열
declare -A user
user[name]="Alice"
user[age]=24
for k in "${!user[@]}"; do
echo "$k = ${user[$k]}"
donemacOS에 기본 포함된 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처럼 명시한 형식으로 직렬화해. ‘배열 문법이 비슷하다’와 ‘데이터 계약이 같다’는 전혀 다른 말이야.