Shell脚本如何将长字符串按分隔符拆分为多行独立存储
解决方案
问题根源有两点:
- 普通
echo命令默认不解析\n转义字符,会直接将其作为字面量输出到文件和弹窗中 - 原有字符串拼接时每次追加的
\n\n会导致每条错误信息之间多出多余空行,末尾也会残留多余换行符
最优修改方案(从拼接逻辑根源优化)
直接调整字符串拼接规则,用printf替代echo保证转义兼容性,修改后的完整代码如下:
#!/bin/sh # 初始化字符串变量避免未定义警告 strg="" if grep -R "Error1 in Machine 1 " /home/new/Report.txt then echo "Error1 found in Machine 1" strg="${strg}Error1 found in Machine 1\n" else echo "No Error found" fi if grep -R "Error2 in Machine 1" /home/new/Report.txt then echo "Error2 found in Machine 1" strg="${strg}Error2 in Machine 1\n" else echo "No Error found" fi if grep -R "Error2 in Machine 2" /home/new/Report.txt then echo "Error2 found in Machine 2" strg="${strg}Error2 in Machine 2\n" else echo "No Error found" fi # whiptail支持\n转义,直接传入即可 whiptail --title "Report Error" --msgbox "${strg}" 24 30 # 用printf输出转义后的内容到文件,自动处理换行 printf "%b" "${strg}" >| /home/new/err_$(date +%Y%m%d%H%M%S).txt
说明:
- 把原有拼接逻辑中的
\n\n改为\n,保证每条错误仅占一行,无多余空行 - 用
printf "%b"替代普通echo,完全兼容POSIX标准解析转义字符,不会出现\n字面量残留问题 - 给
date增加格式化参数+%Y%m%d%H%M%S,避免生成的文件名携带空格导致后续操作异常
无需修改原有拼接逻辑的兼容方案
如果不想调整原有拼接规则,可直接在输出前对已有字符串做过滤处理,删除多余分隔符和空行:
# 转义后删除空行,合并连续换行 processed_strg=$(printf "%b" "${strg}" | sed '/^$/d' | tr -s '\n') # 后续输出使用处理后的变量即可 whiptail --title "Report Error" --msgbox "${processed_strg}" 24 30 echo "${processed_strg}" >| /home/new/err_$(date).txt
内容的提问来源于stack exchange,提问作者Fatima
相关产品推荐
相关产品推荐

