【问题标题】:Pass a variable from Java to a Shell script将变量从 Java 传递到 Shell 脚本
【发布时间】:2014-05-28 08:42:32
【问题描述】:

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

    }

外壳代码:

#!/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');"&

我还在脚本末尾添加了一个回显,以查看变量是否正确传递,并且似乎是正确的。第一个命令(SPARQL 的命令)似乎在确实创建了图形时起作用,但第二个命令没有正确处理..

【问题讨论】:

    标签: java bash shell variables parameters


    【解决方案1】:

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

    ProcessBuilder(String... command)
    

    你必须像这样传递参数:

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

    在脚本中 param1 是 $1 , param2 是 $2 , param3 是 $3 (你可以在构造函数中传入任意数量的参数)

    【讨论】:

    • 谢谢!如何检查参数是否被正确处理?因为当我尝试运行脚本时,执行了第一个 SPARQL 查询,但是 shell 脚本的其他命令没有显示任何效果..
    • 先尝试一个简单的脚本,将参数回显到文件中,如果没问题,然后使用你的upload.sh
    • 我在脚本末尾添加了一个回显,似乎变量确实被正确使用了。我只是不知道为什么这些命令现在不起作用。我对帖子,我是否正确传递了变量?
    • 这是发生的情况,当我将“term.rdf”作为变量时,它似乎没有在命令中正确读取它。当我将其读为“$1.rdf”并在 java 代码中仅输入“term”而不是“term.rdf”时,它可以正常工作.. 有什么原因吗?
    【解决方案2】:

    在脚本中使用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;"&
    

    【讨论】:

    • 谢谢!如何检查参数是否被正确处理?因为当我尝试运行脚本时,执行了第一个 SPARQL 查询,但是 shell 脚本的其他命令没有显示任何效果..
    • 您正在后台运行命令(使用&amp;)。也许他们还在运行?