如何将参数传递给jshell脚本?

时间:2017-10-15 14:59:49

标签: java-9 jshell

问题

我愿意将参数传递给jshell脚本。例如,我会喜欢这样的东西:

jshell myscript.jsh "some text"

然后得到字符串"一些文字"在脚本中的某个变量中可用。

但是,jshell只需要一个文件列表,因此答案是:

File 'some text' for 'jshell' is not found.

有没有办法将参数正确传递给jshell脚本?

到目前为止的解决方法

到目前为止,我唯一的解决方案是在调用脚本时使用环境变量:

ARG="some test" jshell myscript.jsh

然后我可以在脚本中使用以下命令访问它:

System.getenv().get("ARG")

4 个答案:

答案 0 :(得分:7)

那么选项{ String value = System.getProperty("a"); System.out.println("a="+value); } /exit

呢?
> jshell -v -R-Da=b ./file.jsh
a=b

用于脚本

{
  class A {
    public void main(String args[])
    {
        for(String arg : args) {
          System.out.println(arg);
        }
    }
  }

  new A().main(System.getProperty("args").split(" "));
}

会给你

> jshell -R-Dargs="aaa bbb ccc" ./file_2.jsh

另一种方式是:

'This is my arg'

和执行

ant

<强> 更新

以前的解决方案会因更复杂的args而失败。例如。 CommandLine

但我们可以从import org.apache.tools.ant.types.Commandline; { class A { public void main(String args[]) { for(String arg : args) { System.out.println(arg); } } } new A().main(Commandline.translateCommandline(System.getProperty("args"))); } jshell --class-path ./ant.jar -R-Dargs="aaa 'Some args with spaces' bbb ccc" ./file_2.jsh aaa Some args with spaces bbb ccc

中受益
ant.jar

然后,我们可以这样称呼它:

--class-path

当然,#=必须位于通过=:=

传递的路径中

答案 1 :(得分:2)

甲骨文真的搞砸了,没有好办法做到这一点。除了@mko's answer之外,如果您使用Linux(也可能适用于Mac),您可以使用process substitution

jshell <(echo 'String arg="some text"') myscript.jsh

然后您可以在arg中使用myscript.jsh,例如:

System.out.println(arg) // will print "some text"

您可以使用一些bash函数简化它,并且可能编写一个批处理文件,该文件将写入临时文件并在Windows上执行相同的操作。

答案 2 :(得分:0)

Oracle如何忽略这一点完全超出了我。 8-()但是:无论如何:如果您的系统使用bash作为外壳,则可以将this approach替换为(ab-)use system properties的想法,以将整个命令行传输到一个变量中:

//usr/bin/env jshell --execution local "-J-Da=$*" "$0"; exit $?
String commandline = System.getProperty("a");
System.out.println(commandline);
/exit

这样,您可以在命令行上仅添加以下参数即可调用脚本:thisscript.jsh arg1 arg2将显示arg1 arg2

请注意,这会将所有参数连接到一个字符串中,并以一个空格分隔。您可以使用commandline.split("\s")再次拆分它,但是请注意,这并不完全正确:两个参数a b和一个参数"a b"之间没有区别。

如果您有固定数量的参数,也可以使用"-J-Darg1=$1" "-J-Darg2=$1" "-J-Darg3=$1"等将所有这些参数传递到单独的系统属性中。请注意,如果您不使用{{ 3}}

另一个变种是使用bash的--execution local动态生成脚本。在具有bash的类Unix系统上,也可以像-R-D...一样简单地使用这样的脚本。

thisscript.jsh arg1  arg2

这允许访问单个参数,但是当参数中有双引号或其他特殊字符时它将中断。扩展这个想法:这是一种将所有参数放入Java String数组,并引用其中一些字符的方法:

#!/usr/bin/env bash
jshell <(
cat <<EOF
System.out.println("$1");
System.out.println("$2");
/exit
EOF
)

#!/usr/bin/env bash set -- "${@//\\/\\\\}" set -- "${@//\"/\\\"}" set -- "${@/#/\"}" set -- "${@/%/\",}" jshell <( cat <<EOF String[] args = new String[]{$@}; System.out.println(Arrays.asList(args)); /exit EOF ) 语句将双反斜杠,双引号引起来并在set --之前加上前缀",以将参数转换为有效的Java数组。

答案 3 :(得分:0)

使用Java 11的方式如下:

#!/bin/java --source 11

public class JShellTest {
    public static void main(String[] args) {
        System.out.println(args.length);
    }
}

运行脚本时,将自动调用JShellTest.main方法,例如:
./jShellTest.jsh arg0 arg1 arg2 ... argN