Ubuntu环境下Shell脚本未输出预期结果的问题排查
问题排查与修复方案
让我帮你分析下这个Shell脚本没输出预期结果的原因,主要有以下几个核心问题:
1. 匹配模式包含错误字符
你的grep匹配字符串里写了.*java.lang.IndexOutOfBoundsException0.*,但实际生成的javaOutput里的异常类名是java.lang.IndexOutOfBoundsException——多了一个多余的0,这直接导致grep无法匹配到目标异常信息。
2. 异常栈输出被截断
从你提供的javaOutput内容来看,异常信息末尾是ArrayList...,说明完整的异常堆栈跟踪被截断了,并没有包含你期望的ArrayList.java:653和Test.java:142行号信息,自然也无法匹配到模式里的这部分内容。
3. 可选优化:简化匹配逻辑
你当前用tr '\n' ' '把换行替换成空格的操作其实可以简化,grep本身支持处理多行内容,不需要额外转换。如果需要跨多行匹配关键信息,可以使用grep的-A(显示匹配行后N行)或-z(将输入视为以空字符分隔的行)参数。
修复后的脚本示例
针对上述问题,调整后的脚本可以这样写:
#!/bin/sh # -*-sh-*- java -classpath Test.jar Test test1.xml > javaOutput 2>&1; # 简化匹配逻辑,去掉多余的0,同时兼容可能的截断情况 if grep -q "java.lang.IndexOutOfBoundsException.*ArrayList.*Test.java:142" javaOutput; then echo TRUE; else echo FALSE; fi
如果确实需要处理换行转空格的场景,可以用:
#!/bin/sh # -*-sh-*- java -classpath Test.jar Test test1.xml > javaOutput 2>&1; if tr '\n' ' ' < javaOutput | grep -q "java.lang.IndexOutOfBoundsException.*ArrayList.*Test.java:142"; then echo TRUE; else echo FALSE; fi
额外建议
如果异常栈确实被截断,你需要先确保Java程序能输出完整的异常信息:
- 检查Java代码中是否正确打印了完整的异常堆栈(比如使用
e.printStackTrace()而不是只打印异常消息) - 确认系统没有对输出长度做限制(比如某些终端或日志系统的截断设置)
内容的提问来源于stack exchange,提问作者sophist_pt
相关产品推荐
相关产品推荐

