我正在尝试从Java代码运行shell脚本。目前我在脚本中手动提供数据,但我希望能够从运行脚本的Java代码中提供变量。
这是Java代码和脚本:
public static void main(String[] args) {
try {
ProcessBuilder pb = new ProcessBuilder(
"/home/najib/upload.sh");
Process p = pb.start();
p.waitFor();
System.out.println("Script executed successfully");
} catch (Exception e) {
e.printStackTrace();
}
}
shell代码:
#!/bin/bash
/usr/local/virtuoso-opensource/bin/isql 1111 dba dba exec="set AUTOCOMMIT MANUAL;"&
/usr/local/virtuoso-opensource/bin/isql 1111 dba dba exec="delete from DB.DBA.load_list;"&
/usr/local/virtuoso-opensource/bin/isql 1111 dba dba exec="SPARQL CREATE GRAPH <VAR1>;"&
/usr/local/virtuoso-opensource/bin/isql 1111 dba dba exec="ld_dir('/home/najib', 'VAR2', 'VAR1');"&
wait
/usr/local/virtuoso-opensource/bin/isql 1111 dba dba exec="rdf_loader_run();"
我想知道在哪里可以将变量放在Java代码中,以及如何在运行时调用它!
修改 根据提供的解决方案,我将脚本更改为:
/usr/local/virtuoso-opensource/bin/isql 1111 dba dba exec="SPARQL CREATE GRAPH <$2>;"&
/usr/local/virtuoso-opensource/bin/isql 1111 dba dba exec="ld_dir('/home/najib', '$1', '$2');"&
我还在脚本末尾添加了一个echo,以查看变量是否正确传递,看起来它们是。第一个命令(SPARQL一个)似乎工作,因为图形确实已创建,但第二个命令未正确处理..
答案 0 :(得分:1)
您可以将params传递给shell脚本并在de script中使用它们.Class ProcessBuilder有一个构造函数,它执行命令并传递给可执行文件的参数列表:
ProcessBuilder(String... command)
你必须通过这样的参数:
ProcessBuilder pb = new ProcessBuilder("/home/najib/upload.sh",param1,param2,param3);
脚本param1中的是$ 1,param2是$ 2,param3是$ 3(你可以根据需要传入构造函数中的参数)
答案 1 :(得分:0)
在脚本中使用shell变量,通过环境在Java中设置它们:
import java.util.Map;
class so1 {
public static void main(String[] args) {
try {
ProcessBuilder pb = new ProcessBuilder("/home/...sh");
Map<String, String> env = pb.environment();
env.put("VAR1", "something");
Process p = pb.start();
p.waitFor();
System.out.println("Script executed successfully");
} catch (Exception e) {
e.printStackTrace();
}
}
}
在剧本中:
/usr/local/virtuoso-opensource/bin/isql 1111 dba dba exec="SPARQL CREATE GRAPH $VAR1;"&