在自动化运维、CI/CD 流水线、Docker 容器启动等场景中,经常需要在脚本之间传递一组配置值。最直接的想法是用环境变量:export ITEMS="a,b,c"。但 Bash 的环境变量本质是字符串,不能直接存储数组结构。
This is a common pattern in DevOps automation, where environment variables are used to pass configuration values between shell scripts. The challenge is that Bash environment variables are strings, not arrays.
正确的做法是将数组转换为字符串形式后存储,使用时再还原。主要有两种策略:
export ITEMS="a,b,c,d"
IFS=',' read -ra items_array <<< "$ITEMS"
# items_array 现在是一个数组:(a b c d)这种方法简单直观,但有两个明显缺点:元素内容不能包含逗号或空格,且没有类型区分。如果某个元素本身就是"apple, banana"这种带逗号的字符串,解析就会出错。
export ITEMS='["a","b","c"]'
items_json=$(echo "$ITEMS" | jq -r '.[]')
items_array=("$items_json")使用 JSON 的好处是:
环境变量不是无限的存储空间。Unix/Linux 系统的 `environ` 段有长度限制,通常单条环境变量不超过 32KB-128KB。这意味着:
下表总结了不同方案的适用性:
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 少量简单配置项 | 逗号分隔 | 无需额外工具,兼容性最好 |
| 包含特殊字符的内容 | JSON + jq | 解析准确,不易出错 |
| 跨语言共享配置 | JSON 文件 | 避免序列化/反序列化的歧义 |
| 高安全性要求 | 配置文件(非环境变量) | 权限可控,不出现在进程表 |
Bash 环境中存储数组的核心思路是「序列化」。对于简单场景用逗号分隔即可;对于生产环境或复杂数据结构,推荐 JSON 格式配合 jq 工具。最重要的是理解环境变量不是万能存储介质——它适合轻量级、临时的配置传递,不适合持久化存储或大量数据处理。
0 评论