如果使用linux shell脚本没有错误,编译并运行程序

时间:2015-03-06 06:21:21

标签: linux shell

我正在尝试创建一个linux shell脚本,它在java中编译程序并仅在编译器没有错误时运行它。这是我的尝试,它不起作用,并且每次都运行程序,即使有错误:

#!/bin/bash
cd ~/Desktop/Foo/src
compilerOutput=$(javac Foo.java)
if ["$compilerOutput" = ""]; then
    java Foo
fi

2 个答案:

答案 0 :(得分:1)

与任何体面的Unix工具一样,如果出现错误,javac应将其退出代码设置为非零。

javac Foo.java && java Foo

在幕后,shell会检查退出代码(如果要显式检查它,则可以$?使用),并且仅当它为零时才执行下一个操作。

如果你想要更复杂的逻辑,你可以说

if javac Foo.java; then
    date +"%c success" >>logfile.log
    java Foo
else
    date +"%c fail (exit code $?)" >>logfile.log
    echo "Oh dear" | wall
fi

答案 1 :(得分:0)

问题的根本原因是

compilerOutput=$(javac Foo.java)

当您使用command substitution时,仅将标准输出分配给compilerOutput

对于javac,没有标准输出,即标准输出始终为空,您在屏幕上看到的标准错误

即使程序中没有错误也是如此

if ["$compilerOutput" = ""]; then

将始终为true,因为标准输出始终为空


<强>解决方案

执行此操作的正确方法是通过shell变量$?

获取上一个命令的exit status

<强>代码

#!/bin/bash
cd ~/Desktop/Foo/src
javac Foo.java  2> errors
if [ $? = "0" ]; then
    java Foo
fi

所做的更改

  • javac Foo.java 2> errors

    此语句将b标准错误重定向到errors文件

  • if [ $? = "0" ]; then

    检查上一个命令javac Foo.java的退出状态是否为0(成功编译)