소개
이 튜토리얼은 셸 스크립팅에서 Bash 키 - 값 배열 (연관 배열, associative arrays) 을 이해하고 활용하는 과정을 안내합니다. 키 - 값 배열은 숫자 인덱스 대신 설명적인 키를 사용하여 데이터를 저장하고 검색할 수 있는 강력한 데이터 구조입니다.
이 튜토리얼을 마치면, Bash 스크립트에서 키 - 값 배열을 생성, 조작 및 사용하여 데이터를 보다 효과적으로 구성하고 기존 숫자 배열로는 해결하기 어려운 문제를 해결할 수 있게 됩니다.
첫 번째 Bash 키 - 값 배열 생성하기
Bash 키 - 값 배열 (연관 배열, associative arrays) 을 사용하면 Python 의 딕셔너리 또는 JavaScript 의 객체와 유사하게 특정 키에 값을 연결할 수 있습니다. 이는 항목이 위치가 아닌 이름으로 식별되는 구조화된 데이터를 저장하는 데 이상적입니다.
기본 구문
Bash 에서 키 - 값 배열을 사용하려면 먼저 -A 옵션을 사용하여 선언해야 합니다.
declare -A myarray
이렇게 하면 myarray라는 이름의 빈 키 - 값 배열이 생성됩니다. -A 플래그는 Bash 에게 이것이 연관 (키 - 값) 배열임을 명시적으로 알려줍니다.
배열에 요소 추가하기
다양한 과일에 대한 정보를 저장하는 키 - 값 배열을 만들어 보겠습니다.
- WebIDE 에 아직 열려 있지 않은 경우 새 터미널을 엽니다.
- WebIDE 에서 "File > New File"을 클릭하여 새 스크립트 파일을 만듭니다.
- 파일을
/home/labex/project디렉토리에fruit_array.sh로 저장합니다. - 파일에 다음 코드를 추가합니다.
#!/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[@]}"
- 파일을 저장합니다 (Ctrl+S 또는 File > Save).
- 터미널에서 다음 명령을 사용하여 스크립트를 실행 가능하게 만듭니다.
chmod +x fruit_array.sh
- 스크립트를 실행합니다.
./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 키 - 값 배열 조작하기
이제 키 - 값 배열의 기본 사항을 이해했으므로, 이를 조작하는 방법을 살펴보겠습니다. 이 단계에서는 기존 값을 수정하고, 새 요소를 추가하고, 요소를 제거하고, 키가 존재하는지 확인하는 방법을 배우게 됩니다.
새 스크립트 생성하기
/home/labex/project디렉토리에array_operations.sh라는 새 파일을 만듭니다.- 파일에 다음 코드를 추가합니다.
#!/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[@]}"
- 파일을 저장합니다 (Ctrl+S 또는 File > Save).
- 스크립트를 실행 가능하게 만듭니다.
chmod +x array_operations.sh
- 스크립트를 실행합니다.
./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 단계: 구성 파일 만들기
먼저, 몇 가지 샘플 설정이 있는 구성 파일을 만들어 보겠습니다.
/home/labex/project디렉토리에app_config.txt라는 새 파일을 만듭니다.- 파일에 다음 내용을 추가합니다.
database_host=localhost
database_port=3306
database_user=admin
database_password=secret123
app_name=MyAwesomeApp
debug_mode=true
max_connections=100
- 파일을 저장합니다.
2 단계: 구성 관리자 스크립트 만들기
이제 이 구성 파일을 읽고 내용을 키 - 값 배열에 저장하는 스크립트를 만들어 보겠습니다.
/home/labex/project디렉토리에config_manager.sh라는 새 파일을 만듭니다.- 파일에 다음 코드를 추가합니다.
#!/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)"
- 파일을 저장합니다 (Ctrl+S 또는 File > Save).
- 스크립트를 실행 가능하게 만듭니다.
chmod +x config_manager.sh
- 스크립트를 실행합니다.
./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)
구성 관리자 이해하기
생성한 스크립트는 몇 가지 중요한 작업을 수행합니다.
- 구성 파일에서 키 - 값 쌍을 읽습니다.
- 이러한 쌍을 키 - 값 배열에 저장합니다.
- 다음 기능을 제공합니다.
- 파일에서 구성을 로드합니다.
- 기본값으로 특정 구성 값을 가져옵니다.
- 모든 구성 설정을 표시합니다.
이 패턴은 실제 응용 프로그램에서 구성 설정을 관리하는 데 일반적으로 사용됩니다. 주요 이점은 다음과 같습니다.
- 중앙 집중식 구성: 모든 설정이 한 곳에 있습니다.
- 기본값: 설정이 누락된 경우 기본값을 사용할 수 있습니다.
- 쉬운 액세스: 설정은 이름으로 액세스할 수 있습니다.
- 유연성: 스크립트를 변경하지 않고 구성을 업데이트할 수 있습니다.
이 예제는 셸 스크립팅에서 키 - 값 배열을 사용하여 실용적인 문제를 해결하는 방법을 보여줍니다. 변경 사항을 구성 파일에 다시 저장하거나 설정을 검증하는 기능을 추가하여 이를 확장할 수 있습니다.
키 - 값 배열을 사용한 메뉴 기반 스크립트 구축하기
이 마지막 단계에서는 키 - 값 배열을 사용하여 사용자 선택을 저장하고 처리하는 실용적인 메뉴 기반 스크립트를 만들 것입니다. 이 예제는 키 - 값 배열을 사용하여 보다 대화형이고 사용자 친화적인 명령줄 응용 프로그램을 만드는 방법을 보여줍니다.
메뉴 시스템 만들기
/home/labex/project디렉토리에menu_system.sh라는 새 파일을 만듭니다.- 파일에 다음 코드를 추가합니다.
#!/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
- 파일을 저장합니다 (Ctrl+S 또는 File > Save).
- 스크립트를 실행 가능하게 만듭니다.
chmod +x menu_system.sh
- 스크립트를 실행합니다.
./menu_system.sh
- 해당 번호를 입력하여 다양한 메뉴 옵션을 시도한 다음, 메뉴로 돌아가려면 프롬프트가 표시될 때 Enter 키를 누릅니다. 완료되면
q를 입력하여 프로그램을 종료합니다.
메뉴 시스템 이해하기
이 스크립트는 키 - 값 배열의 몇 가지 고급 사용법을 보여줍니다.
- 메뉴 옵션:
menu_options배열은 옵션 번호를 설명 텍스트에 매핑합니다. - 명령 매핑:
menu_commands배열은 옵션 번호를 함수 이름에 매핑합니다. - 동적 실행: 스크립트는 한 배열의 값을 사용하여 호출할 함수를 결정합니다.
이 메뉴 시스템에서 키 - 값 배열을 사용하면 다음과 같은 이점이 있습니다.
- 유지 관리 용이성: 메뉴 옵션을 추가하거나 수정하려면 배열만 업데이트하면 됩니다.
- 가독성: 코드는 어떤 명령이 어떤 메뉴 옵션에 해당하는지 명확하게 보여줍니다.
- 유연성: 함수 호출을 변경하지 않고 메뉴 항목의 순서를 쉽게 변경할 수 있습니다.
이 패턴은 유지 관리 및 확장이 용이한 대화형 명령줄 도구를 만드는 데 유용합니다.
주요 내용
이 튜토리얼을 통해 다음을 배웠습니다.
- Bash 에서 키 - 값 배열을 생성하고 초기화하는 방법
- 키 - 값 배열에서 요소에 액세스하고, 수정하고, 제거하는 방법
- 키 - 값 배열에서 키와 값을 반복하는 방법
- 키 - 값 배열을 사용하여 구성 데이터를 저장하는 방법
- 키 - 값 배열을 사용하여 대화형 메뉴 시스템을 만드는 방법
이러한 기술은 간단한 데이터 저장에서 복잡한 대화형 응용 프로그램에 이르기까지 광범위한 셸 스크립팅 작업에 적용할 수 있습니다.
요약
이 튜토리얼에서는 Bash 키 - 값 배열의 강력함과 다재다능함을 살펴보았습니다. 기본 사항부터 시작하여 키 - 값 배열을 생성하고 액세스하는 방법을 배우고, 요소 수정, 추가 및 제거와 같은 보다 고급 작업으로 진행했습니다.
이 지식을 적용하여 파일에서 설정을 읽는 구성 관리자와 키 - 값 배열을 사용하여 대화형 명령줄 응용 프로그램을 만드는 방법을 보여주는 메뉴 기반 유틸리티 스크립트를 포함한 실용적인 예제를 만들었습니다.
키 - 값 배열은 Bash 스크립트에서 데이터를 구성하고 액세스하는 강력한 방법을 제공합니다. 숫자 인덱스 대신 설명적인 키를 사용할 수 있으므로 특히 복잡한 데이터 구조를 처리할 때 스크립트의 가독성과 유지 관리성이 향상됩니다.
이제 Bash 에서 키 - 값 배열에 대한 확실한 이해를 갖게 되었으므로, 이를 사용하여 셸 스크립트를 개선하고 광범위한 프로그래밍 문제를 보다 효율적으로 해결할 수 있습니다.



