shell变量不直接解析配置文件,但可通过source加载合法赋值语句,或用read+while循环处理带注释/空格的键值对,并export导出为环境变量以供子进程使用,支持通过参数切换多环境配置文件。

Shell 变量本身不直接“解析”配置文件(比如 ini、yaml 或 json),但可以通过变量赋值、引用和条件逻辑,把配置文件中的关键参数提取出来并用于脚本控制——这是一种轻量、可靠、无需额外依赖的配置驱动方式。
从普通文本配置文件读取变量值
假设你有一个简单的配置文件 config.conf:
APP_NAME="myapp" LISTEN_PORT=8080 ENABLE_LOG=true DB_URL="mysql://localhost:3306/test"
你可以用 source 或 . 命令安全加载它(前提是该文件只含合法变量赋值语句):
- source config.conf 或 . config.conf
- 之后直接使用 $APP_NAME、$LISTEN_PORT 等变量
- 注意:文件中不能有语法错误(如等号前后空格、未闭合引号),否则 source 会报错退出
用 read + while 循环按行提取键值对
当配置文件格式稍松散(例如支持注释、空行、等号前后空格),推荐用循环逐行处理:
while IFS='=' read -r key value; do [[ -z "$key" || "$key" =~ ^[[:space:]]*# ]] && continue key=$(echo "$key" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//') value=$(echo "$value" | sed 's/^[[:space:]]*//; s/[[:space:]]*$//') [[ -n "$key" ]] && declare "$key=$value" done <p>这样能跳过注释和空行,并自动 trim 空格。之后 <font color="blue">$APP_NAME</font> 等变量即可使用。</p><h3>区分环境变量与局部变量,确保作用域正确</h3><p>从配置文件加载的变量默认是<strong>局部变量</strong>,仅在当前 shell 或脚本内有效。若需子进程(如调用的 Python 脚本、curl 命令)也能读取,必须用 <strong>export</strong> 显式导出:</p>
- 加载后批量导出:export $(grep "^[A-Z_]*=" config.conf | cut -d= -f1)
- 或在循环中边读边导出:export "$key=$value"
- 验证是否生效:env | grep APP_NAME(环境变量)或 set | grep APP_NAME(所有变量)
配合配置文件路径实现多环境切换
通过变量控制加载哪个配置,是常见实践:
ENV=${1:-"dev"} # 参数传入环境名,默认 dev
CONFIG_FILE="config.${ENV}.conf"
if [[ -f "$CONFIG_FILE" ]]; then
source "$CONFIG_FILE"
else
echo "配置文件 $CONFIG_FILE 不存在" >&2
exit 1
fi
echo "当前运行环境:$ENV,应用名:$APP_NAME"
执行时只需:./deploy.sh prod,即可加载 config.prod.conf 并使用其中定义的变量。











