Bash 키 - 값 배열 활용: 셸 스크립팅 마스터하기

ShellBeginner
지금 연습하기

소개

이 튜토리얼은 셸 스크립팅에서 Bash 키 - 값 배열 (연관 배열, associative arrays) 을 이해하고 활용하는 과정을 안내합니다. 키 - 값 배열은 숫자 인덱스 대신 설명적인 키를 사용하여 데이터를 저장하고 검색할 수 있는 강력한 데이터 구조입니다.

이 튜토리얼을 마치면, Bash 스크립트에서 키 - 값 배열을 생성, 조작 및 사용하여 데이터를 보다 효과적으로 구성하고 기존 숫자 배열로는 해결하기 어려운 문제를 해결할 수 있게 됩니다.

첫 번째 Bash 키 - 값 배열 생성하기

Bash 키 - 값 배열 (연관 배열, associative arrays) 을 사용하면 Python 의 딕셔너리 또는 JavaScript 의 객체와 유사하게 특정 키에 값을 연결할 수 있습니다. 이는 항목이 위치가 아닌 이름으로 식별되는 구조화된 데이터를 저장하는 데 이상적입니다.

기본 구문

Bash 에서 키 - 값 배열을 사용하려면 먼저 -A 옵션을 사용하여 선언해야 합니다.

declare -A myarray

이렇게 하면 myarray라는 이름의 빈 키 - 값 배열이 생성됩니다. -A 플래그는 Bash 에게 이것이 연관 (키 - 값) 배열임을 명시적으로 알려줍니다.

배열에 요소 추가하기

다양한 과일에 대한 정보를 저장하는 키 - 값 배열을 만들어 보겠습니다.

  1. WebIDE 에 아직 열려 있지 않은 경우 새 터미널을 엽니다.
  2. WebIDE 에서 "File > New File"을 클릭하여 새 스크립트 파일을 만듭니다.
  3. 파일을 /home/labex/project 디렉토리에 fruit_array.sh로 저장합니다.
  4. 파일에 다음 코드를 추가합니다.
#!/bin/bash

## Declare a key-value array
declare -A fruits

## Add elements to the array
fruits["apple"]="red"
fruits["banana"]="yellow"
fruits["grape"]="purple"
fruits["orange"]="orange"

## Print a specific element
echo "The color of an apple is ${fruits["apple"]}"

## Print all values
echo "All fruit colors: ${fruits[@]}"

## Print all keys
echo "All fruits: ${!fruits[@]}"
  1. 파일을 저장합니다 (Ctrl+S 또는 File > Save).
  2. 터미널에서 다음 명령을 사용하여 스크립트를 실행 가능하게 만듭니다.
chmod +x fruit_array.sh
  1. 스크립트를 실행합니다.
./fruit_array.sh

다음과 유사한 출력을 볼 수 있습니다.

The color of an apple is red
All fruit colors: red yellow purple orange
All fruits: apple banana grape orange

출력 이해하기

  • ${fruits["apple"]}: 이 구문은 "apple" 키와 관련된 값을 검색합니다.
  • ${fruits[@]}: 이 구문은 배열의 모든 값을 반환합니다.
  • ${!fruits[@]}: 배열 이름 앞에 ! 기호는 배열의 모든 키를 반환합니다.

Bash 키 - 값 배열을 사용하면 숫자 위치를 기억할 필요 없이 의미 있는 이름을 사용하여 데이터에 직접 액세스할 수 있으므로 스크립트의 가독성과 유지 관리성이 향상됩니다.

Bash 키 - 값 배열 조작하기

이제 키 - 값 배열의 기본 사항을 이해했으므로, 이를 조작하는 방법을 살펴보겠습니다. 이 단계에서는 기존 값을 수정하고, 새 요소를 추가하고, 요소를 제거하고, 키가 존재하는지 확인하는 방법을 배우게 됩니다.

새 스크립트 생성하기

  1. /home/labex/project 디렉토리에 array_operations.sh라는 새 파일을 만듭니다.
  2. 파일에 다음 코드를 추가합니다.
#!/bin/bash

## Declare a key-value array
declare -A user_info

## Add initial elements
user_info["name"]="John Doe"
user_info["email"]="john@example.com"
user_info["age"]="30"
user_info["city"]="New York"

## Display initial array content
echo "--- Initial user information ---"
for key in "${!user_info[@]}"; do
  echo "$key: ${user_info[$key]}"
done

## Modify an existing value
user_info["age"]="31"

## Add a new key-value pair
user_info["country"]="USA"

## Check if a key exists
if [[ -v user_info["email"] ]]; then
  echo -e "\nEmail exists: ${user_info["email"]}"
else
  echo -e "\nEmail does not exist"
fi

## Remove an element
unset 'user_info[city]'

## Display the modified array
echo -e "\n--- Modified user information ---"
for key in "${!user_info[@]}"; do
  echo "$key: ${user_info[$key]}"
done

## Count the number of elements
echo -e "\nNumber of elements: ${#user_info[@]}"
  1. 파일을 저장합니다 (Ctrl+S 또는 File > Save).
  2. 스크립트를 실행 가능하게 만듭니다.
chmod +x array_operations.sh
  1. 스크립트를 실행합니다.
./array_operations.sh

다음과 유사한 출력을 볼 수 있습니다.

--- Initial user information ---
name: John Doe
email: john@example.com
age: 30
city: New York

Email exists: john@example.com

--- Modified user information ---
name: John Doe
country: USA
email: john@example.com
age: 31

Number of elements: 4

주요 연산 설명

  • 값 수정: 기존 키에 새 값을 할당하기만 하면 됩니다: user_info["age"]="31"
  • 새 요소 추가: 초기 할당과 동일한 구문을 사용합니다: user_info["country"]="USA"
  • 키 존재 여부 확인: -v 테스트 연산자를 사용합니다: [[ -v user_info["email"] ]]
  • 요소 제거: unset 명령을 사용합니다: unset 'user_info[city]'
  • 요소 수 세기: ${#array[@]}를 사용하여 요소 수를 얻습니다.
  • 요소 반복: 모든 키를 얻기 위해 ${!array[@]}와 함께 for 루프를 사용합니다.

수정된 출력에서 city 키 - 값 쌍이 제거되고 새로운 country 키 - 값 쌍이 추가된 것을 확인하십시오. 또한 age 값은 30 에서 31 로 업데이트되었습니다.

이러한 연산은 스크립트에서 동적 데이터를 사용할 때 필수적이며, 필요에 따라 정보를 업데이트할 수 있습니다.

실용적인 구성 관리자 만들기

이제 키 - 값 배열을 생성하고 조작하는 방법을 이해했으므로, 실용적인 것을 만들어 보겠습니다. 이 단계에서는 설정 파일을 로드하고, 키 - 값 배열에 저장하며, 이에 액세스할 수 있는 간단한 구성 관리자를 만들 것입니다.

1 단계: 구성 파일 만들기

먼저, 몇 가지 샘플 설정이 있는 구성 파일을 만들어 보겠습니다.

  1. /home/labex/project 디렉토리에 app_config.txt라는 새 파일을 만듭니다.
  2. 파일에 다음 내용을 추가합니다.
database_host=localhost
database_port=3306
database_user=admin
database_password=secret123
app_name=MyAwesomeApp
debug_mode=true
max_connections=100
  1. 파일을 저장합니다.

2 단계: 구성 관리자 스크립트 만들기

이제 이 구성 파일을 읽고 내용을 키 - 값 배열에 저장하는 스크립트를 만들어 보겠습니다.

  1. /home/labex/project 디렉토리에 config_manager.sh라는 새 파일을 만듭니다.
  2. 파일에 다음 코드를 추가합니다.
#!/bin/bash

## Define the path to the configuration file
CONFIG_FILE="/home/labex/project/app_config.txt"

## Declare a key-value array for the configuration
declare -A config

## Function to load configuration from file
load_config() {
  local file=$1

  ## Check if the file exists
  if [[ ! -f "$file" ]]; then
    echo "Error: Configuration file '$file' not found."
    return 1
  fi

  ## Read the file line by line
  while IFS='=' read -r key value; do
    ## Skip empty lines and comments
    if [[ -z "$key" || "$key" == \#* ]]; then
      continue
    fi

    ## Store the key-value pair in the array
    config["$key"]="$value"
  done < "$file"

  echo "Configuration loaded successfully from '$file'"
  return 0
}

## Function to get a configuration value
get_config() {
  local key=$1
  local default=$2

  ## Check if the key exists
  if [[ -v config["$key"] ]]; then
    echo "${config["$key"]}"
  else
    echo "$default"
  fi
}

## Function to display all configuration
display_config() {
  echo "--- Configuration Settings ---"
  for key in "${!config[@]}"; do
    echo "$key = ${config[$key]}"
  done
}

## Load the configuration
load_config "$CONFIG_FILE"

## Display all configuration settings
display_config

## Example of getting specific configuration values
echo -e "\n--- Example Usage ---"
db_host=$(get_config "database_host" "127.0.0.1")
db_port=$(get_config "database_port" "5432")
db_user=$(get_config "database_user" "root")
db_pass=$(get_config "database_password" "")
app_name=$(get_config "app_name" "DefaultApp")
debug_mode=$(get_config "debug_mode" "false")

echo "Database connection: $db_user@$db_host:$db_port"
echo "Application name: $app_name"
echo "Debug mode: $debug_mode"

## Example of getting a non-existent value (will use default)
timeout=$(get_config "connection_timeout" "30")
echo "Connection timeout: $timeout (default value used)"
  1. 파일을 저장합니다 (Ctrl+S 또는 File > Save).
  2. 스크립트를 실행 가능하게 만듭니다.
chmod +x config_manager.sh
  1. 스크립트를 실행합니다.
./config_manager.sh

다음과 유사한 출력을 볼 수 있습니다.

Configuration loaded successfully from '/home/labex/project/app_config.txt'
--- Configuration Settings ---
database_host = localhost
database_port = 3306
database_user = admin
database_password = secret123
app_name = MyAwesomeApp
debug_mode = true
max_connections = 100

--- Example Usage ---
Database connection: admin@localhost:3306
Application name: MyAwesomeApp
Debug mode: true
Connection timeout: 30 (default value used)

구성 관리자 이해하기

생성한 스크립트는 몇 가지 중요한 작업을 수행합니다.

  1. 구성 파일에서 키 - 값 쌍을 읽습니다.
  2. 이러한 쌍을 키 - 값 배열에 저장합니다.
  3. 다음 기능을 제공합니다.
    • 파일에서 구성을 로드합니다.
    • 기본값으로 특정 구성 값을 가져옵니다.
    • 모든 구성 설정을 표시합니다.

이 패턴은 실제 응용 프로그램에서 구성 설정을 관리하는 데 일반적으로 사용됩니다. 주요 이점은 다음과 같습니다.

  • 중앙 집중식 구성: 모든 설정이 한 곳에 있습니다.
  • 기본값: 설정이 누락된 경우 기본값을 사용할 수 있습니다.
  • 쉬운 액세스: 설정은 이름으로 액세스할 수 있습니다.
  • 유연성: 스크립트를 변경하지 않고 구성을 업데이트할 수 있습니다.

이 예제는 셸 스크립팅에서 키 - 값 배열을 사용하여 실용적인 문제를 해결하는 방법을 보여줍니다. 변경 사항을 구성 파일에 다시 저장하거나 설정을 검증하는 기능을 추가하여 이를 확장할 수 있습니다.

키 - 값 배열을 사용한 메뉴 기반 스크립트 구축하기

이 마지막 단계에서는 키 - 값 배열을 사용하여 사용자 선택을 저장하고 처리하는 실용적인 메뉴 기반 스크립트를 만들 것입니다. 이 예제는 키 - 값 배열을 사용하여 보다 대화형이고 사용자 친화적인 명령줄 응용 프로그램을 만드는 방법을 보여줍니다.

메뉴 시스템 만들기

  1. /home/labex/project 디렉토리에 menu_system.sh라는 새 파일을 만듭니다.
  2. 파일에 다음 코드를 추가합니다.
#!/bin/bash

## Declare a key-value array for menu options
declare -A menu_options
menu_options["1"]="Display system information"
menu_options["2"]="Check disk usage"
menu_options["3"]="List running processes"
menu_options["4"]="View network connections"
menu_options["q"]="Quit"

## Declare a key-value array for commands to execute
declare -A menu_commands
menu_commands["1"]="display_system_info"
menu_commands["2"]="check_disk_usage"
menu_commands["3"]="list_processes"
menu_commands["4"]="view_network"

## Function to display system information
display_system_info() {
  echo -e "\n--- System Information ---"
  echo "Hostname: $(hostname)"
  echo "Kernel version: $(uname -r)"
  echo "System uptime: $(uptime -p)"
  echo "CPU information: $(grep 'model name' /proc/cpuinfo | head -1 | cut -d ':' -f 2 | xargs)"
  echo "Total memory: $(free -h | grep Mem | awk '{print $2}')"
}

## Function to check disk usage
check_disk_usage() {
  echo -e "\n--- Disk Usage ---"
  df -h | grep -v tmp
}

## Function to list running processes
list_processes() {
  echo -e "\n--- Top 10 Processes by Memory Usage ---"
  ps aux --sort=-%mem | head -11
}

## Function to view network connections
view_network() {
  echo -e "\n--- Active Network Connections ---"
  netstat -tuln | grep LISTEN
}

## Function to display the menu
display_menu() {
  echo -e "\n=== System Utility Menu ==="
  for key in 1 2 3 4 q; do
    echo "$key. ${menu_options[$key]}"
  done
  echo -e "\nPlease enter your choice:"
}

## Main loop
while true; do
  ## Display the menu
  display_menu

  ## Read user choice
  read -r choice

  ## Check if choice is valid
  if [[ -v menu_options["$choice"] ]]; then
    ## Exit if user chose quit
    if [[ "$choice" == "q" ]]; then
      echo "Exiting. Goodbye!"
      exit 0
    fi

    ## Execute the corresponding command
    if [[ -v menu_commands["$choice"] ]]; then
      ## Call the function associated with the choice
      ${menu_commands["$choice"]}
    fi
  else
    echo "Invalid option. Please try again."
  fi

  ## Pause for user to read output
  echo -e "\nPress Enter to continue..."
  read -r
done
  1. 파일을 저장합니다 (Ctrl+S 또는 File > Save).
  2. 스크립트를 실행 가능하게 만듭니다.
chmod +x menu_system.sh
  1. 스크립트를 실행합니다.
./menu_system.sh
  1. 해당 번호를 입력하여 다양한 메뉴 옵션을 시도한 다음, 메뉴로 돌아가려면 프롬프트가 표시될 때 Enter 키를 누릅니다. 완료되면 q를 입력하여 프로그램을 종료합니다.

메뉴 시스템 이해하기

이 스크립트는 키 - 값 배열의 몇 가지 고급 사용법을 보여줍니다.

  1. 메뉴 옵션: menu_options 배열은 옵션 번호를 설명 텍스트에 매핑합니다.
  2. 명령 매핑: menu_commands 배열은 옵션 번호를 함수 이름에 매핑합니다.
  3. 동적 실행: 스크립트는 한 배열의 값을 사용하여 호출할 함수를 결정합니다.

이 메뉴 시스템에서 키 - 값 배열을 사용하면 다음과 같은 이점이 있습니다.

  • 유지 관리 용이성: 메뉴 옵션을 추가하거나 수정하려면 배열만 업데이트하면 됩니다.
  • 가독성: 코드는 어떤 명령이 어떤 메뉴 옵션에 해당하는지 명확하게 보여줍니다.
  • 유연성: 함수 호출을 변경하지 않고 메뉴 항목의 순서를 쉽게 변경할 수 있습니다.

이 패턴은 유지 관리 및 확장이 용이한 대화형 명령줄 도구를 만드는 데 유용합니다.

주요 내용

이 튜토리얼을 통해 다음을 배웠습니다.

  1. Bash 에서 키 - 값 배열을 생성하고 초기화하는 방법
  2. 키 - 값 배열에서 요소에 액세스하고, 수정하고, 제거하는 방법
  3. 키 - 값 배열에서 키와 값을 반복하는 방법
  4. 키 - 값 배열을 사용하여 구성 데이터를 저장하는 방법
  5. 키 - 값 배열을 사용하여 대화형 메뉴 시스템을 만드는 방법

이러한 기술은 간단한 데이터 저장에서 복잡한 대화형 응용 프로그램에 이르기까지 광범위한 셸 스크립팅 작업에 적용할 수 있습니다.

요약

이 튜토리얼에서는 Bash 키 - 값 배열의 강력함과 다재다능함을 살펴보았습니다. 기본 사항부터 시작하여 키 - 값 배열을 생성하고 액세스하는 방법을 배우고, 요소 수정, 추가 및 제거와 같은 보다 고급 작업으로 진행했습니다.

이 지식을 적용하여 파일에서 설정을 읽는 구성 관리자와 키 - 값 배열을 사용하여 대화형 명령줄 응용 프로그램을 만드는 방법을 보여주는 메뉴 기반 유틸리티 스크립트를 포함한 실용적인 예제를 만들었습니다.

키 - 값 배열은 Bash 스크립트에서 데이터를 구성하고 액세스하는 강력한 방법을 제공합니다. 숫자 인덱스 대신 설명적인 키를 사용할 수 있으므로 특히 복잡한 데이터 구조를 처리할 때 스크립트의 가독성과 유지 관리성이 향상됩니다.

이제 Bash 에서 키 - 값 배열에 대한 확실한 이해를 갖게 되었으므로, 이를 사용하여 셸 스크립트를 개선하고 광범위한 프로그래밍 문제를 보다 효율적으로 해결할 수 있습니다.