Java程序输出导入Shell脚本遇问题:Bash测试时异常直接输出
问题解决步骤
你的脚本有三个关键问题导致当前状况:
- Java程序抛出的异常信息输出到标准错误流(stderr),而
$(...)默认只捕获标准输出流(stdout),所以异常会直接打印到终端,没被actualOutput变量捕获 - 变量名拼写错误:
expectedOuput多打了个u,应该是expectedOutput if判断里的变量没加双引号,当变量为空时会导致Bash语法错误
修正后的脚本
#!/bin/bash input="" expectedOutput="Please enter correct input" # 把stderr重定向到stdout,让异常信息也被捕获 actualOutput=$(java CurrencyConverter "$input" 2>&1) # 变量加双引号,避免空值导致语法错误 if [ "$expectedOutput" == "$actualOutput" ]; then echo "Test 1 Passed" else echo "Test 1 Failed" fi
各修改点说明
- 重定向错误流:在命令末尾加
2>&1,意思是把stderr(文件描述符2)的内容重定向到stdout(文件描述符1),这样$(...)就能捕获到Java程序的所有输出(包括异常)。 - 修正变量名:把
expectedOuput改成expectedOutput,确保判断时变量名一致。 - 变量加双引号:
"$expectedOutput"和"$actualOutput"加双引号,防止变量为空时,Bash把[ == ]当成无效语法报错。
现在运行脚本,就能捕获到Java的异常信息,然后和期望的输出对比,输出Test 1 Failed,同时不会直接打印Java错误(除非你在脚本里主动输出actualOutput)。
内容的提问来源于stack exchange,提问作者Ewando
相关产品推荐
相关产品推荐

