Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将变量从Java传递到Shell脚本_Java_Bash_Shell_Variables_Parameters - Fatal编程技术网

将变量从Java传递到Shell脚本

将变量从Java传递到Shell脚本,java,bash,shell,variables,parameters,Java,Bash,Shell,Variables,Parameters,我正在尝试从Java代码运行shell脚本。目前,我正在脚本中手动提供数据,但我希望能够从运行脚本的Java代码中提供变量 这是Java代码和脚本: public static void main(String[] args) { try { ProcessBuilder pb = new ProcessBuilder( "/home/najib/upload.sh"); Process p = p

我正在尝试从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();
          }

    }
/usr/local/virtuoso-opensource/bin/isql 1111 dba dba exec="SPARQL CREATE GRAPH $VAR1;"&
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();"
#/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=“从DB.dba.load\u列表中删除;”&
/usr/local/virtuoso opensource/bin/isql 1111 dba dba exec=“SPARQL CREATE GRAPH;”&
/usr/local/virtuoso opensource/bin/isql 1111 dba dba exec=“ld_dir('/home/najib','VAR2','VAR1')&
等待
/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');"&
/usr/local/virtuoso opensource/bin/isql 1111 dba dba exec=“SPARQL CREATE GRAPH;”&
/usr/local/virtuoso opensource/bin/isql 1111 dba dba exec=“ld_dir('/home/najib','$1','$2');”&

我还在脚本的末尾添加了一个echo,以查看变量是否正确传递,看起来它们是正确的。第一个命令(SPARQL命令)似乎在图形确实创建时起作用,但第二个命令处理不正确

在脚本中使用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();
        }

    }

}

您可以将参数传递给shell脚本并在de脚本中使用它们,类ProcessBuilder有一个构造函数,该构造函数接受要执行的命令以及要传递给可执行文件的参数列表:

ProcessBuilder(String... command)
您必须像这样传递参数:

 ProcessBuilder pb = new ProcessBuilder("/home/najib/upload.sh",param1,param2,param3);

在脚本内部,param1是$1,param2是$2,param3是$3(您可以在构造函数中传递任意多个参数)

谢谢!如何检查参数是否正确处理?因为当我尝试运行脚本时,会执行第一个SPARQL查询,但是shell脚本的其他命令不会显示任何效果。您正在后台运行命令(使用
&
)。也许他们还在跑?谢谢!如何检查参数是否正确处理?因为当我尝试运行脚本时,会执行第一个SPARQL查询,但shell脚本的其他命令不会显示任何效果。.首先尝试使用一个简单的脚本,将参数回送到文件中,如果可以,则使用上载。shI在脚本末尾添加了回送,并且似乎确实正确使用了变量。。我只是不知道为什么那些命令现在不起作用。。我在文章中做了一个编辑,我是否正确地传递了变量?下面是发生的情况,当我将“term.rdf”作为变量时,它似乎没有在命令中正确地读取它。当我把它读作“$1.rdf”并且在java代码中只输入“term”而不是“term.rdf”时,它工作正常。。有什么原因吗?