news 2026/2/9 15:06:15

【Linux 基础知识系列:第二百一十九篇】Bash 关联数组(字典)的使用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Linux 基础知识系列:第二百一十九篇】Bash 关联数组(字典)的使用

一、简介:为什么必须学会关联数组?

在日常脚本开发中,我们经常会遇到“键-值”型数据:

  • 根据主机名找 IP

  • 根据用户名查邮箱

  • 统计每个 URL 的出现次数

使用普通数值索引数组arr[0]=alice)需要手工维护映射表,既麻烦又容易出错。
Bash 4.0 起内置关联数组(Associative Array),功能等价于其他语言的“字典(Dictionary)”或“Map”:

  • 键可以是任意字符串,不再局限于 0 1 2 …

  • 读写速度 O(1),脚本依然轻量

  • 无需额外安装软件,比外部调用 awk/sed 更快速、可读性更高

掌握关联数组,让你的脚本从“玩具级”跃升到“工程级”。


二、核心概念:一张表看懂关联数组

术语说明示例
关联数组键→值 的映射表declare -A site=( [google]="216.58.200.46" )
键(key)唯一字符串google
值(value)任意字符串216.58.200.46
声明告诉 Bash 这是关联数组declare -A arr
遍历逐个访问键/值for key in "${!arr[@]}"

注意: Bash 3 及以下不支持,macOS 默认 Bash 3 需brew install bash


三、环境准备:2 分钟搞定

  1. 检查版本

    bash --version | head -1 # ≥ 4.0 即可
  2. 若 < 4.0(CentOS 7、macOS 默认)

    # CentOS sudo yum install -y bash # macOS brew install bash
  3. 进入实验目录

    mkdir -p ~/bash-dict && cd ~/bash-dict

四、命令与示例:从定义到遍历,一站式 copy & run

以下脚本均保存为demo.sh,直接chmod +x demo.sh && ./demo.sh即可看到结果。


4.1 声明与赋值

#!/usr/bin/env bash # demo1.sh declare -A config # ① 声明关联数组 config[host]="192.168.1.10" # ② 赋值 config[user]="root" config[port]="22" echo "主机=${config[host]}" # ③ 读取 echo "用户=${config[user]}"

输出:

主机=192.168.1.10 用户=root

4.2 一次批量赋值(花括号法)

#!/usr/bin/env bash # demo2.sh declare -A color=( [red]="#FF0000" [green]="#00FF00" [blue]="#0000FF" ) echo 红色代码=${color[red]}

4.3 安全读取:防未定义键

#!/usr/bin/env bash # demo3.sh declare -A cfg cfg[timeout]=30 # 如果键不存在返回默认值 timeout=${cfg[timeout]:-60} # ← 60 是默认值 echo "超时时间=$timeout"

4.4 遍历键与值

#!/usr/bin/env bash # demo4.sh declare -A score=( [alice]=90 [bob]=80 [carol]=85 ) # 遍历键 for name in "${!score[@]}"; do echo "$name 分数是 ${score[$name]}" done

技巧:

  • "${!score[@]}"取全部键

  • "${score[@]}"取全部值

  • 顺序与插入顺序无关(哈希实现)


4.5 计数器:统计单词出现次数

#!/usr/bin/env bash # demo5.sh declare -A counter while read -r word; do ((counter[$word]++)) # 不存在时自动初始为 0 done < <(echo "apple apple banana apple") for w in "${!counter[@]}"; do echo "$w 出现了 ${counter[$w]} 次" done

输出:

apple 出现了 3 次 banana 出现了 1 次

4.6 修改与删除

#!/usr/bin/env bash # demo6.sh declare -A site site[google]="216.58.200.46" # 修改 site[google]="142.250.185.78" echo "新 IP=${site[google]}" # 删除 unset site[google] [[ -v site[google] ]] && echo "仍存在" || echo "已删除"

4.7 长度与判空

echo "键数量=${#config[@]}" [[ ${#config[@]} -eq 0 ]] && echo "数组为空"

4.8 嵌套模拟(二维键)

Bash 不支持真正的二维数组,可用拼接键技巧:

declare -A matrix matrix[1,1]=10 matrix[1,2]=20 echo "${matrix[1,2]}" # 输出 20

4.9 与配置文件联动:一行导入

# config.txt 内容: # host=192.168.1.10 # user=root # port=22 declare -A cfg while IFS='=' read -r key value; do cfg[$key]=$value done < config.txt echo "导入完成,主机=${cfg[host]}"

4.10 函数返回值:返回字典

# 返回多个值的最佳实践 function get_dbinfo() { local -A db db[host]="localhost" db[port]=3306 db[user]="admin" # 打印键值对,调用者用 eval 重建 for k in "${!db[@]}"; do echo "$k=${db[$k]}" done } # 调用端 declare -A dbinfo while IFS='=' read -r k v; do dbinfo[$k]=$v done < <(get_dbinfo) echo "数据库端口=${dbinfo[port]}"

五、常见问题与解答(FAQ)

问题现象解决
declare -A报错“invalid option”Bash < 4.0升级 Bash,brew install bash/yum install bash
键顺序乱与插入顺序不同关联数组底层哈希,排序用 `for k in (printf′{!arr[@]}"sort)`
空格被截断arr[key]=val ue双引号包裹:arr[key]="val ue"
变量未定义却返回 0((${counter[$word]}++))这是预期行为;若需严格判空先用[[ -v counter[$word] ]]
macOS 默认 sh 不支持#!/bin/sh失败shebang 写#!/usr/bin/env bash且确保新 bash 路径在/etc/shells

六、实践建议与最佳实践

  1. 统一封装:把常用读配置写成函数,避免全局变量污染。

  2. 默认安全:读取加:-默认值,脚本在 CI 里更健壮。

  3. 大文件提速:>10 万键时,用外部 SQLite;Bash 数组仍轻量,但别滥用。

  4. 命名规范:全大写表示常量,例declare -A CONFIG=()

  5. 调试技巧

    declare -p arr # 打印完整键值对,排错神器
  6. 兼容考虑:若脚本需支持 Bash 3,回退到awk关联数组,但放弃 Bash 原生。


七、总结:一张脑图带走全部要点

Bash 关联数组 ├─ 声明:declare -A arr ├─ 赋值:arr[key]=val / 批量 ( [k]=v ) ├─ 读取:${arr[key]} / ${arr[key]:-default} ├─ 遍历:for k in "${!arr[@]}" ├─ 计数:((arr[key]++)) └─ 技巧:config 文件一键导入、函数返回字典

掌握关联数组,你的脚本就能:

  • 30 行写完过去需要awk + grep100 行的配置解析

  • 让 CI 流水线、自动部署脚本易读、易维护、易扩展

  • 无外部依赖的嵌入式环境,也能享受“字典”级数据结构

现在就打开终端,复制第 4.5 节的计数器脚本跑一遍——Bash 也有现代数据结构,只是你还没开始用!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/9 0:08:52

Legion Go 屏幕键盘调不出来?3 种解决方案,输入无阻碍!

作为主打便携性的掌机&#xff0c;Legion Go 让玩家能随时随地开启游戏或处理轻量任务&#xff0c;但不少用户在使用中会遇到一个棘手问题&#xff1a;在游戏登录页、软件注册界面等场景下&#xff0c;点击输入框后屏幕键盘迟迟不弹出&#xff0c;没有外接实体键盘时根本无法输…

作者头像 李华
网站建设 2026/2/5 2:05:51

脑-肠轴紊乱是怎么回事?如何处理?

脑-肠轴紊乱揭示了大脑与肠道之间复杂的双向沟通出现异常&#xff0c;这常常是生活压力、不良情绪与肠胃不适恶性循环的生理基础。要打破这个循环&#xff0c;需要从身心两方面共同入手。下面这个表格可以帮助你快速抓住核心信息。方面核心表现简要说明什么是脑-肠轴大脑与肠道…

作者头像 李华
网站建设 2026/2/8 1:02:01

WeChatPad安卓微信多设备登录终极指南

还在为微信单设备限制而烦恼吗&#xff1f;WeChatPad为您带来革命性的安卓微信多设备登录解决方案&#xff01;通过智能激活微信官方平板模式&#xff0c;实现真正的微信多设备同时在线体验。 【免费下载链接】WeChatPad 强制使用微信平板模式 项目地址: https://gitcode.com…

作者头像 李华
网站建设 2026/2/7 21:58:54

【R语言GPT函数实战指南】:掌握高效AI编程的7个核心技巧

第一章&#xff1a;R语言GPT函数用法概述在R语言中&#xff0c;虽然原生并未提供名为“GPT”的内置函数&#xff0c;但通过第三方包&#xff08;如 gpt、textgen 或调用API封装&#xff09;可实现与GPT模型交互的功能。这些工具允许用户在数据分析流程中集成自然语言生成能力&a…

作者头像 李华
网站建设 2026/2/5 4:29:28

【R语言变量重要性排序实战】:掌握5种高效算法快速定位关键变量

第一章&#xff1a;R语言变量重要性排序的核心价值在构建预测模型时&#xff0c;识别哪些变量对结果影响最大是数据分析的关键环节。R语言提供了多种方法来评估和排序变量的重要性&#xff0c;帮助数据科学家优化模型结构、提升解释能力并减少过拟合风险。为何变量重要性至关重…

作者头像 李华
网站建设 2026/2/5 5:40:53

智慧树自动学习插件:解放双手的智能刷课神器

智慧树自动学习插件&#xff1a;解放双手的智能刷课神器 【免费下载链接】zhihuishu 智慧树刷课插件&#xff0c;自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 你是否曾经因为智慧树视频无法自动播放下一集而烦恼&#xff1…

作者头像 李华