You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

bash/sh如何正确获取含换行符的环境变量列表及对应值

Shell 正确读取含换行等特殊字符的环境变量方案

问题根源

常规按行解析env输出的方式会失效,因为环境变量值允许包含换行符,换行后的值内容会被误识别为新的环境变量条目。

核心依据

POSIX 标准明确规定:环境变量名称不能包含=和NUL(\0)字符,环境变量值不能包含NUL字符。因此NUL是唯一可以安全分隔不同环境变量条目的字符。

场景1:仅需要读取单个已知名称的环境变量

直接使用printenv命令即可,无需解析任何输出,天然支持所有合法的环境变量值(包括换行、空格、特殊符号等):

# 直接读取MYVAR的值到变量
my_val=$(printenv MYVAR)
# 打印验证,注意变量必须加双引号避免换行被展开
echo "$my_val"

场景2:需要遍历所有环境变量(GNU 环境 + Bash/Zsh)

GNU 版本的env命令支持-0参数,会用NUL字符分隔每个环境变量条目,配合shell的read -d ''即可安全逐条目读取:

# 遍历所有环境变量,不会受值内换行干扰
declare -A env_map
while IFS='=' read -r -d '' var_name var_value; do
    env_map["$var_name"]="$var_value"
    # 示例:筛选MYVAR
    if [[ "$var_name" == "MYVAR" ]]; then
        echo "找到MYVAR,值为:$var_value"
    fi
done < <(env -0)

提示:使用进程替换< <(env -0)而非管道env -0 | while ...,可以避免while块在子shell中执行、内部定义的变量外部无法访问的问题。

场景3:仅需要获取所有环境变量的名称列表

如果只需要变量名不需要取值,Bash 可以直接使用内置的compgen -e命令,直接逐行输出所有环境变量名,完全不受值内容影响:

# 输出所有环境变量名
compgen -e

# 遍历所有环境变量名的示例
for var_name in $(compgen -e); do
    echo "环境变量名:$var_name"
done

场景4:POSIX sh 兼容场景(无GNU工具、无Bash特性)

可以解析export -p的输出,POSIX 标准规定export -p的输出为可被shell直接执行的赋值语句,所有特殊字符都会被正确转义引用,不会出现换行干扰解析的问题:

# 提取所有环境变量名的POSIX兼容写法
export -p | sed 's/^export //;s/=.*//'

内容的提问来源于stack exchange,提问作者Grzegorz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 07:57:04