很多人第一次把 Bash 数组传给子进程时,都会写成 `export arr=(a b)`,结果下游脚本看到的只剩一坨字符串。GNU Bash 手册明确区分了 environment 和 arrays:环境变量本质上是按名字传递的字符串参数,而数组是 shell 里的结构化变量,不是天然的环境变量容器。[1][2]
这也是为什么一到空元素、空格、稀疏下标,直接 export 就会出问题。GNU Bash 的 Arrays 章节还提醒过,关联数组的 key 不能是空字符串;Stack Overflow 的讨论里,Bash 维护者 Chet Ramey 也直说过,没有一个好办法能把数组变量编码进环境里。[2][3]
方法
更稳的做法不是硬塞进环境,而是先序列化,再在子进程里恢复。Unix & Linux 的讨论里,常见方案是用 `declare -p array` 保留索引,再在同版本 bash、同 locale 下恢复;如果只需要单向传参,还可以直接改成位置参数 `"$@"`,或者把列表写成换行分隔再交给 `readarray` 读取。[3][4]
- 先判断你要传的是“配置”还是“列表”,能传字符串就别传数组。
- 如果必须保留索引,用 `declare -p` 序列化,别直接 `export`。
- 如果只是给下游消费,优先改成 `"$@"`、NUL 分隔或换行分隔。
如果你的下游还是别的 shell,最安全的边界其实是停在字符串层,不要指望跨进程还原出同样的数组语义。CI 里也建议把“数组传参”和“环境变量配置”拆开,前者走命令行或临时文件,后者只放开关型配置,这样调试路径会清楚很多。[1][2]
我更推荐的判断很简单,环境变量适合小而平的配置,不适合带空格、空元素和稀疏索引的 Bash 数组。你一旦把数组当成字符串容器,后面排查问题会轻松很多。[1][2][3][4]
参考文献
[1] Environment — Bash Reference Manual
[2] Arrays — Bash Reference Manual
[3] Exporting an array in bash script — Stack Overflow
[4] Unable to use an Array as environment variable — Unix & Linux Stack Exchange

全部 0条评论