我愿意将参数传递给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")
答案 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)
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
。