最稳妥的方式是重定向输入(while read -r line; do ...; done
Linux 中用
while read按行读取配置文件,核心是安全、逐行、不破坏原始格式。最稳妥的方式是重定向输入(),而不是管道(cat file | while read),避免子 shell 导致变量失效。标准写法:重定向 + IFS 和 -r 选项
这是推荐的健壮写法,能正确处理空格、开头/结尾空白、反斜杠等特殊字符:
IFS=防止行首尾空格被 trim-r禁用反斜杠转义(如\n不会被解释为换行)- 使用
重定向,确保read在当前 shell 执行示例脚本:
host=localhost
- 用
=分割,取第一段为 key,其余为 value- 用
[[ $line =~ ^[[:space:]]*([a-zA-Z_][a-zA-Z0-9_]*)[[:space:]]*=[[:space:]]*(.*)$ ]]正则匹配更严谨简化版(适用于无空格 value):
Linux Security Scanner下载Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
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:]]*$//') echo "KEY=$key → VALUE=$value" done <h3>注意常见陷阱</h3><p>以下写法看似一样,但行为不同:</p>
cat config.conf | while read line; do ...; done→line只在子 shell 中有效,循环外无法访问for line in $(cat config.conf); do ...; done→ 按空白分割,含空格的值会被切碎,不适用配置文件while read line; do ...; done → 缺少IFS=和-r,可能丢首尾空格或误解析\配合字段切割处理结构化配置
若配置文件是空格/制表符分隔的多列(如
user1 admin /home/user1),可用read直接拆字段:IFS=$'\t'












