甲骨文怎么会忽略这一点,这完全超出了我的理解。8-() 但无论如何:如果您的系统使用 bash 作为 shell,您可以将这种替换 shebang 的方法与(ab-)使用系统属性将整个命令行传输到变量中的想法结合起来:
//usr/bin/env jshell --execution local "-J-Da=$*" "$0"; exit $?
String commandline = System.getProperty("a");
System.out.println(commandline);
/exit
这样,您可以在命令行上调用脚本,只需添加参数:thisscript.jsh arg1 arg2
将 print arg1 arg2
。
请注意,这会将所有参数连接到一个字符串中,并用一个空格分隔。您可以使用 再次拆分它commandline.split("\s")
,但请注意这并不准确:两个参数a b
和一个参数之间没有区别"a b"
。
如果您有固定数量的参数,您也可以将所有这些参数传递给单独的系统属性"-J-Darg1=$1" "-J-Darg2=$1" "-J-Darg3=$1"
等。请注意,-R-D...
如果您不使用,则必须使用--execution local
另一个变体是使用 bash 的进程替换动态生成脚本。thisscript.jsh arg1 arg2
您也可以在具有 bash 的类 Unix 系统上简单地使用这样的脚本。
#!/usr/bin/env bash
jshell <(
cat <<EOF
System.out.println("$1");
System.out.println("$2");
/exit
EOF
)
这允许访问单个参数,尽管当参数中有双引号或其他特殊字符时它会中断。扩展这个想法:这是一种将所有参数放入 Java String 数组的方法,引用其中一些字符:
#!/usr/bin/env bash
set -- "${@//\\/\\\\}"
set -- "${@//\"/\\\"}"
set -- "${@/#/\"}"
set -- "${@/%/\",}"
jshell <(
cat <<EOF
String[] args = new String[]{$@};
System.out.println(Arrays.asList(args));
/exit
EOF
)
语句使用set --
双反斜杠、双引号和前缀 a"
并附加 a",
以将参数转换为有效的 Java 数组。