Bash内层循环吞掉换行符导致输出合并为一行如何解决?
问题解决方法
核心原因
内层循环输出换行丢失是两处错误导致的:
- 你没有将
collect_results的内层返回结果转换为数组,TESTRESULTS=$(collect_results $TESTFILE)得到的是带换行的单条字符串变量,而非按行拆分的数组元素,遍历时只会拿到一个包含所有结果的整体字符串。 - 输出变量时没有加双引号,Bash会自动对未加引号的变量做分词处理,所有空白符(换行、制表符、空格)都会被替换为单个空格,导致换行被吞。
修复方案
将内层相关代码修改为如下形式即可:
# 和外层RESULTS写法保持一致,将结果转为按行拆分的数组 TESTRESULTS=( $(collect_results "$TESTFILE") ) for TESTRESULT in "${TESTRESULTS[@]}"; do # 输出时给变量加双引号,保留原始换行格式 echo "$TESTRESULT" done
优化建议
为避免后续遇到特殊字符、空格相关的解析问题,建议所有变量引用的位置都加上双引号,比如:
FUNCTION=$(get_function_name "$RESULT")FILE=$(get_file "$RESULT")TMP=$(echo "$FILE" | sed "s/src/tests\/TestCase/")
养成变量加双引号的习惯,可以规避绝大多数Bash字符串处理类的问题。
内容的提问来源于stack exchange,提问作者rrd
相关产品推荐
相关产品推荐

