java-9jshell

How to pass arguments to a jshell script?


Question

I am willing to pass arguments to a jshell script. For instance, I would have liked something like this:

jshell myscript.jsh "some text"

and then to have the string "some text" available in some variable inside the script.

However, jshell only expects a list of files, therefore the answer is:

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

Is there any way to properly pass arguments to a jshell script?

Workaround so far

My only solution so far is to use an environment variable when calling the script:

ARG="some test" jshell myscript.jsh

And then I can access it in the script with:

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

Solution

  • And what about option -R

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

    for script

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

    will give you

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

    Another way, would be following:

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

    and execution

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

    Update

    Previous solution will fail with more complex args. E.g. 'This is my arg'.

    But we can benefit from ant and it's CommandLine class

    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")));
    }
    

    and then, we can call it like this:

    jshell --class-path ./ant.jar -R-Dargs="aaa 'Some args with spaces' bbb ccc" ./file_2.jsh
    aaa
    Some args with spaces
    bbb
    ccc
    

    Of course, ant.jar must be in the path that is passed via --class-path