直接将多行配置文件整体读入变量或数组,保持原始结构(换行、缩进、空格、注释)不变地传给函数;推荐用 $(cat file) 加双引号(适用于无NUL、不超几MB的普通配置),或 mapfile 一字不差保留空行与尾部换行。

直接把多行配置文件内容作为“整块参数”传给函数,关键不是逐行处理,而是保持换行、缩进、空格、注释等原始结构不变地整体传递。这和“每行当一个参数”完全不同——后者用 while read,而前者需要把整个文件内容读成一个变量或数组元素,再安全交给函数。
用 $(cat file) + 双引号是最简方式
适用于内容不超几 MB、无嵌入 NUL 字符的普通配置文件(如 ini、conf、yaml 片段):
#!/bin/bash
parse_config() {
local content="$1" # 严格用双引号包裹
echo "共 $(echo "$content" | wc -l) 行"
# 后续可 grep、sed、awk 或自定义解析逻辑
}
<p>config=$(cat settings.conf) # 一次性读取全部内容
parse_config "$config" # 必须加双引号,否则换行丢失、空格塌陷</p>⚠️ 注意:$(cat) 会删掉末尾空行(bash 命令替换的固有行为),若需保留,改用 mapfile。
用 mapfile 保留全部原始行(含空行和尾部换行)
这是真正“一字不差”加载的推荐方式,尤其适合带空行分段、注释对齐的配置:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
#!/bin/bash
parse_config() {
local -a lines=("$@") # 接收所有位置参数为数组
echo "共 ${#lines[@]} 行(含空行)"
for i in "${!lines[@]}"; do
printf "%d: %s\n" "$i" "${lines[i]}"
done
}
<p>mapfile -t config_lines < settings.conf # -t 去掉每行末尾换行符(可选)
parse_config "${config_lines[@]}" # 展开为独立参数,每行一个元素</p>✅ 优势:保留所有空行、开头/结尾空格;-t 可选,去掉换行符便于后续处理;"${arr[@]}" 确保每行作为独立参数传入,不被拆分。
函数内接收整块内容时,避免常见陷阱
无论用哪种方式传入,函数内部必须注意:
-
永远用
"$1",不用$1—— 不加引号会导致换行变空格、路径含空格失效 - 若内容含 NUL(
\0),bash 无法处理,需换用perl或python解析 - 不要用
for line in $1处理整块内容 —— 这会按空白分割,彻底破坏结构 - 想在函数里按行遍历?用
while IFS= read -r line重读传入的字符串:
parse_config() {
local content="$1"
while IFS= read -r line; do
# 处理每一行,保留空格和空行
[[ -z "$line" ]] && echo "(空行)" || echo "内容: $line"
done <<< "$content" # 注意这里用 <<<,不是 <
}
不适合整块传递的情况,该换思路
如果配置文件极大(百 MB 以上)、或需流式解析、或含二进制数据,就别硬塞进变量:
- 直接让函数接受文件路径:
parse_config settings.conf,函数内部用while read流式处理 - 用
source加载简单键值配置(如KEY=value),但需确保内容可信、无执行风险 - 对复杂格式(JSON/YAML),优先调用
jq或yq命令行工具,而非手写解析

















