linux中读取配置文件键值对并转为变量,首选source命令(要求格式为key=value),但存在安全风险;不可信配置应使用sed/awk提取赋值以避免执行风险。

Linux 系统中读取配置文件的键值对并自动转为变量,核心在于“安全解析 + 可靠赋值”。最常用、最直接的方式是使用 source(或 .)命令,但前提是配置文件格式必须是合法的 shell 赋值语句;若格式更复杂(如带节区的 INI),则需借助专用工具或脚本解析。
用 source 命令加载纯键值对配置文件
适用于形如 KEY=value 的简单配置文件(无节、无注释干扰、无空格未引号包裹):
- 配置文件示例(
config.env):DB_HOST=127.0.0.1<br>DB_PORT=5432<br>ENABLE_LOG="true"
- 在 shell 中执行:
source config.env或. config.env - 之后可直接使用:
echo $DB_HOST→ 输出127.0.0.1 - ⚠️ 注意:该方式会**直接执行文件内容**,存在安全风险。确保文件来源可信,且不包含命令(如
rm -rf /)或危险语法。
用 sed/awk 安全提取并导出变量(推荐用于不可信配置)
避免执行任意代码,只提取 KEY=VALUE 行并安全赋值:
- 一行命令提取并设置(仅当前 shell 有效):
set -o allexport; source - 说明:
–sed过滤出干净的键值行,去掉空行、注释和前后空格;
–set -o allexport让后续定义的变量自动导出为环境变量;
–是进程替换,避免写临时文件。
处理标准 INI 格式(含 [section])
INI 文件不能直接 source,需解析节与键。有几种可靠选择:
-
Python + configparser(最稳妥):
python3 -c "import configparser; c=configparser.ConfigParser(); c.read('app.ini'); print(c['database']['host'])" -
Bash + awk(轻量级节感知解析):
可编写函数按节匹配,例如:get_ini_value() { section="$1"; key="$2"; awk -v s="\[$section\]" -v k="$key" '$0~s{f=1;next} /^[/ && f{f=0} f && $0~"^"k"[[:space:]]*=[[:space:]]*"{sub(/^[^=]*=[[:space:]]*/,"");print;exit}' app.ini; }
调用:DB_HOST=$(get_ini_value database host) - 第三方工具如 crudini(需安装):
crudini --get app.ini database host→ 直接输出值
读取后设为环境变量供子进程使用
无论用哪种方式读取,若需让子进程(如启动的程序)继承这些变量,必须用 export 显式导出:
- 例如从配置中读到
API_TOKEN=abc123,应写成:export API_TOKEN="abc123" - 批量导出可结合
declare -x或上文的set -o allexport - 验证是否生效:
env | grep API_TOKEN或printenv API_TOKEN











