如何从Java程序返回一些值到shell?

pra*_*sad 7 java linux shell

我想从shell脚本运行一个Java程序.所以我做了类似下面的事情

我的测试Java文件如下

public class EchoTest {
    public static void main (String args[]) {
    System.out.println ("scuccess ..!!");
}
Run Code Online (Sandbox Code Playgroud)

我的测试shell脚本文件如下

out=$(java EchoTest)    
echo $out
Run Code Online (Sandbox Code Playgroud)

我编译了java程序,然后我运行了那个shell脚本(比如$ sh Myscript.sh).现在它将输出打印到console.Upto现在它正常工作.

如果我写一个像下面的程序(抛出一些异常)

  public class EchoTest {
        public static void main (String args[]) {
        System.out.println ("Value is "+(2/0));
    }
Run Code Online (Sandbox Code Playgroud)

它只是将java异常打印到控制台上.但是我的要求是我希望它在控制台上打印0或1,即当我的java程序失败时我希望得到0(零)并且想要在java程序成功执行时得到1(一).

Ser*_*sta 5

来自java程序的文档说:

退出状态

启动程序通常会返回以下退出值,通常是在使用错误的参数,严重错误或从Java虚拟机引发的异常调用启动程序时.但是,Java应用程序可以选择使用API​​调用System.exit(exitValue)返回任何值.

  • 0:成功完成.
  • > 0:发生错误.

因此,如果您不执行任何操作,JVM遵循以下惯例约定:在成功完成时将0值返回给调用者,并在出现错误时返回非null值.

那么你的shell脚本应该是:

java EchoTest
if [ $? -eq 0]
then echo 1
else echo 0
fi
Run Code Online (Sandbox Code Playgroud)

这意味着您可以忽略标准输出和标准错误,只需依赖JVM的退出状态.

正如@alk所建议的,你甚至可以out = $( java EchoTest )成功分支代替第一行并使用$out它(当时是)$?0


Fré*_*nri 4

您需要使用System.exit(code)您想要的代码,具体取决于您是否检测到错误/异常

你将会拥有

System.exit(0) // if you detect error, you need to handle exception
System.exit(1) // when no error
Run Code Online (Sandbox Code Playgroud)

  • 我还要在这里指出,当程序成功运行时,*大多数*程序会返回 0,并返回一个大于 0 的数字来表示特定错误。 (3认同)
  • 清楚,但他特别提到当我的java程序失败时获取0(零),并希望在java程序成功执行时获取1(一)。 (3认同)