iBetter Books
수정

연관 배열

인덱스 배열은 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은 키 목록을 줄 단위로 나눈 다음 숫자 순으로 정렬합니다. 연관 배열 자체는 순서를 보장하지 않으므로, 정렬이 필요할 때는 이런 방법을 씁니다.