2

我正在尝试执行一个从 Java 获取 3 个参数的 bash 脚本,以下是我创建命令行的代码

CommandLine command = new CommandLine(/bin/bash);
command.addArgument(ScriptName);
command.addArgument(Param1);
command.addArgument(Param2);
command.addArgument(Param3);

当我传递非空参数时,这就像一个魅力。但不能正常工作,因为参数之一为空(即“”)

详细地说,在某些情况下 Param2 = ""。现在执行 bash 脚本时,不考虑 Param2 = "",而是采用 Param2 = Param 3(值)和 Param3 = undefined。

我该如何阻止这种情况发生?

编辑:Param1、Param2 和 Param3 实际上是传递给 bash 脚本的文件名。其中,Param1 => File1,Param2 => 文件 2 & Param3 => 输出文件

Bash 脚本实际上是在文件 1 上调用并生成一些指标并将其存储在输出文件中。生成指标时,会生成 2 类指标。

  1. 绝对
  2. 相对的

绝对值是在文件 1 上生成的,而相对值是在比较文件 1 和文件 2 之后生成的。在 bash 脚本中,如果文件 2 没有作为参数传入,则我有条件,不要生成相对指标。

这就是设计。现在,当没有文件 2 进行比较时,问题就出现了,在这种情况下,我希望生成绝对指标,而忽略相对指标。

但是现在发生在我身上的是参数 3(即输出文件)被认为是文件 2(这完全是不受欢迎的),而我的相对指标生成需要折腾。

使用 Runtime.getRuntime().exec 时,我可以通过引用它来做到这一点。即 /bin/bash Script Param1 "" Param3 这就像一个魅力。

在我尝试减少代码并获得良好的跨平台支持时,我引入了 commons-exec 并且问题开始出现。

所以,我的问题仍然是,如何使用 commons-exec 命令行将 Param2 的值传递和空值到 bash 脚本?

4

2 回答 2

4

您可以尝试自己处理报价:

if (Param.isEmpty()) {
    command.addArgument("\"\"", false);
} else {
    command.addArgument(Param2);
}

要不就:

command.addArgument("\"" + Param2 + "\"", false);

我从未使用过它,但正在学习[:-)

更新:这对我有用(萨尔曼):

CommandLine command = new CommandLine(/bin/bash);
command.addArgument(ScriptName);
command.addArgument(Param1);

if (Param2== null || Param2.trim().length() == 0) {
    command.addArgument("\"\"", false);
} else {
    command.addArgument(Param2);
}

command.addArgument(Param3);
于 2011-03-31T11:43:28.117 回答
2

在开始评估之前检查参数长度

这是我的想法:

public static void main(String[] args) {
        if (args.length != 3) {
            //print usage message throw exception or whatever System.exit afterwards
        }
        //individual agrument evaluation
        for (int i = 0; i < args.length; i++) {
            //if length less then one, or whatever you prefer
            if(args[i].length() < 1){
                //print usage message
                //throw exception exit the program 
            }
        }
    }
于 2011-03-31T10:19:11.570 回答