Bash中read解析含换行的|分隔字符串时丢失换行问题
问题分析与解决方案
你的问题核心在于IFS的错误设置以及Bash默认将空白字符(包括换行)作为字段分隔符的行为,导致解析时字段内的换行被替换成了空格。
问题根源
- IFS设置语法错误:你写的
IFS=\'"$sMABz_IFS"\'多了不必要的转义符和引号,导致IFS被设置为'|'(包含单引号),而非预期的纯|。 - 默认空白字符分隔规则:即使正确指定IFS为
|,Bash的IFS默认还包含空格、换行、制表符,这些字符依然会被当作字段分隔符,所以字段内的换行被自动替换成了空格。
修正后的代码
#!/bin/bash sMABz_IFS="|" MABzBuildAlert () { read -r -d '' pThirdFieldTwoLines << sAPPEND_STRING_EOM_2 INTFARE.D240319.T1100 INTFARE.D240319.T1101 sAPPEND_STRING_EOM_2 echo "FirstField${sMABz_IFS}SecondField${sMABz_IFS}${pThirdFieldTwoLines}${sMABz_IFS}FourthField" } sMABzAlert=$(MABzBuildAlert) # 推荐用$()替代``,可读性更强且支持嵌套 echo "** 使用read -r 正确解析**" echo "sMABzAlert:[$sMABzAlert]" # 临时设置IFS为|,仅保留|作为分隔符,-r参数避免转义字符被处理 IFS="$sMABz_IFS" read -r sFirstField sSecondField sThirdFieldTwoLines sFourthField <<< "$sMABzAlert" echo "sFirstField:[$sFirstField]" echo "sSecondField:[$sSecondField]" echo "sThirdFieldTwoLines:[$sThirdFieldTwoLines]" echo "sFourthField:[$sFourthField]" echo
关键修改点
- 替换命令替换写法:用
$(MABzBuildAlert)替代`MABzBuildAlert`,这是Bash更规范的写法,避免嵌套时的语法问题。 - 修正IFS设置:
IFS="$sMABz_IFS"直接将分隔符设置为纯|,消除语法错误。 - 直接传递变量到read:无需通过
echo中转,避免不必要的字符转换。
测试输出
运行修正后的脚本,会得到你期望的结果:
** 使用read -r 正确解析** sMABzAlert:[FirstField|SecondField|INTFARE.D240319.T1100 INTFARE.D240319.T1101|FourthField] sFirstField:[FirstField] sSecondField:[SecondField] sThirdFieldTwoLines:[INTFARE.D240319.T1100 INTFARE.D240319.T1101] sFourthField:[FourthField]
内容的提问来源于stack exchange,提问作者user23691540
相关产品推荐
相关产品推荐

