You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:53:45