연관 배열
인덱스 배열은 0, 1, 2 같은 숫자로 요소에 접근합니다. 연관 배열은 문자열을 키로 씁니다. status["404"]="Not Found", score["철수"]=85 같은 식입니다. 다른 언어의 딕셔너리(Python), 해시맵(Java), 객체(JavaScript)와 비슷한 개념입니다.
Bash 4.0부터 지원합니다. Ubuntu 24.04의 기본 Bash는 5.x이므로 사용에 문제없습니다.
declare -A 선언
연관 배열은 반드시 declare -A로 먼저 선언해야 합니다. 선언 없이 문자열 키를 사용하면 Bash가 이를 일반 변수로 처리해서 예상치 못한 결과가 나옵니다.
declare -A colorscolors["red"]="#FF0000"colors["green"]="#00FF00"colors["blue"]="#0000FF"
선언과 동시에 초기화할 수도 있습니다.
declare -A colors=( ["red"]="#FF0000" ["green"]="#00FF00" ["blue"]="#0000FF")
키에 공백이 있어도 따옴표로 감싸면 됩니다.
declare -A infoinfo["first name"]="길동"info["last name"]="홍"
키-값 접근
declare -A useruser["name"]="홍길동"user["age"]=30user["city"]="서울"# 값 읽기echo "${user["name"]}" # 홍길동echo "${user["age"]}" # 30# 전체 값 목록echo "${user[@]}" # 홍길동 30 서울 (순서 보장 안 됨)# 전체 키 목록 (! 사용)echo "${!user[@]}" # name age city (순서 보장 안 됨)# 요소 개수echo "${#user[@]}" # 3
연관 배열은 순서가 보장되지 않습니다. 입력한 순서대로 출력되지 않을 수 있습니다. 순서가 중요하다면 키 목록을 따로 정렬해서 사용해야 합니다.
키 존재 확인
어떤 키가 배열에 있는지 확인하려면 -v 플래그를 씁니다.
declare -A configconfig["debug"]="true"config["port"]=8080# 키 존재 확인if [[ -v config["debug"] ]]; then echo "debug 설정 있음: ${config["debug"]}"fiif [[ ! -v config["verbose"] ]]; then echo "verbose 설정 없음 → 기본값 사용" config["verbose"]="false"fi
-v는 변수가 설정되어 있는지 확인합니다. 빈 문자열로 설정된 경우에도 -v는 참을 반환합니다. 이 점이 값이 비어있는지 확인하는 것과 다릅니다.
요소 삭제
declare -A datadata["a"]=1data["b"]=2data["c"]=3unset data["b"] # 키 "b" 삭제echo "${!data[@]}" # a cecho "${data[@]}" # 1 3
배열 전체를 삭제하려면 unset data를 씁니다.
실습: HTTP 상태 코드 사전 스크립트
HTTP 상태 코드와 설명을 연관 배열에 저장하고 조회하는 스크립트입니다.
#!/bin/bash# 새 파일: http_status.sh# HTTP 상태 코드 사전declare -A http_status=( [200]="OK" [201]="Created" [204]="No Content" [301]="Moved Permanently" [302]="Found" [304]="Not Modified" [400]="Bad Request" [401]="Unauthorized" [403]="Forbidden" [404]="Not Found" [405]="Method Not Allowed" [409]="Conflict" [422]="Unprocessable Entity" [429]="Too Many Requests" [500]="Internal Server Error" [502]="Bad Gateway" [503]="Service Unavailable" [504]="Gateway Timeout")# 상태 코드 조회 함수lookup_status() { local code="$1" if [[ -v http_status[$code] ]]; then echo "${code} ${http_status[$code]}" return 0 else echo "알 수 없는 상태 코드: ${code}" return 1 fi}# 상태 코드 종류별 출력print_by_range() { local label="$1" local start="$2" local end="$3" local code echo "--- ${label} ---" # 키를 정렬해서 출력 for code in $(echo "${!http_status[@]}" | tr ' ' '\n' | sort -n); do if (( code >= start && code <= end )); then printf " %-6s %s\n" "${code}" "${http_status[$code]}" fi done}# --- 실행 ---echo "=== HTTP 상태 코드 조회 ==="echo ""# 개별 조회lookup_status 200lookup_status 404lookup_status 500lookup_status 999 # 없는 코드echo ""# 범위별 출력print_by_range "2xx 성공" 200 299echo ""print_by_range "3xx 리다이렉션" 300 399echo ""print_by_range "4xx 클라이언트 오류" 400 499echo ""print_by_range "5xx 서버 오류" 500 599
실행 결과는 다음과 같습니다.
=== HTTP 상태 코드 조회 ===
200 OK
404 Not Found
500 Internal Server Error
알 수 없는 상태 코드: 999
--- 2xx 성공 ---
200 OK
201 Created
204 No Content
--- 3xx 리다이렉션 ---
301 Moved Permanently
302 Found
304 Not Modified
--- 4xx 클라이언트 오류 ---
400 Bad Request
401 Unauthorized
403 Forbidden
404 Not Found
405 Method Not Allowed
409 Conflict
422 Unprocessable Entity
429 Too Many Requests
--- 5xx 서버 오류 ---
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
echo "${!http_status[@]}" | tr ' ' '\n' | sort -n은 키 목록을 줄 단위로 나눈 다음 숫자 순으로 정렬합니다. 연관 배열 자체는 순서를 보장하지 않으므로, 정렬이 필요할 때는 이런 방법을 씁니다.