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

Gwe*_*dal 15 java-9 jshell

我愿意将参数传递给jshell脚本.例如,我会喜欢这样的事情:

jshell myscript.jsh "some text"
Run Code Online (Sandbox Code Playgroud)

然后在脚本中的某个变量中提供字符串"some text".

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

File 'some text' for 'jshell' is not found.
Run Code Online (Sandbox Code Playgroud)

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

迄今为止的解决方法

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

ARG="some test" jshell myscript.jsh
Run Code Online (Sandbox Code Playgroud)

然后我可以在脚本中访问它:

System.getenv().get("ARG")
Run Code Online (Sandbox Code Playgroud)

Oo.*_*.oO 7

选项怎么样? -R

> jshell -v -R-Da=b ./file.jsh
Run Code Online (Sandbox Code Playgroud)

用于脚本

{
  String value = System.getProperty("a");
  System.out.println("a="+value);
}
/exit
Run Code Online (Sandbox Code Playgroud)

会给你

> jshell -v -R-Da=b ./file.jsh
a=b
Run Code Online (Sandbox Code Playgroud)

另一种方式,将遵循:

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

  new A().main(System.getProperty("args").split(" "));
}
Run Code Online (Sandbox Code Playgroud)

和执行

> jshell -R-Dargs="aaa bbb ccc" ./file_2.jsh
Run Code Online (Sandbox Code Playgroud)

更新

以前的解决方案将失败,更复杂的args.例如'This is my arg'.

但我们可以从中受益,ant而且它也是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")));
}
Run Code Online (Sandbox Code Playgroud)

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

jshell --class-path ./ant.jar -R-Dargs="aaa 'Some args with spaces' bbb ccc" ./file_2.jsh
aaa
Some args with spaces
bbb
ccc
Run Code Online (Sandbox Code Playgroud)

当然,ant.jar必须在通过的路径中--class-path