我正在尝试执行一个从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上调用并生成一些指标并将其存储在其中 输出文件。生成指标时,会生成两类指标。
在文件1上生成绝对值,而在比较文件1和文件1之后生成相对值。文件2.在bash脚本中我有条件,如果文件2没有作为参数传入,请不要生成相对指标。
这就是设计。现在问题出现在没有文件2存在进行比较的情况下,在这种情况下我希望生成绝对指标而忽略相对指标。
但是现在我发生的事情是Param 3(即输出文件)被认为是文件2(这是完全不受欢迎的),而我的相对指标生成则需要折腾。
使用Runtime.getRuntime()。exec我能够通过引用它来做到这一点。即/ bin / bash Script Param1“”Param3就像魅力一样。
在我尝试减少代码并获得良好的跨平台支持时,我引入了commons-exec并且问题开始出现。
所以,我的问题仍然是,如何使用commons-exec CommandLine将Param2的值传递给bash脚本?
答案 0 :(得分: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);
答案 1 :(得分: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
}
}
}