如何从shell或windows命令行内联执行java jshell命令

时间:2017-10-14 01:13:48

标签: java java-9 jshell

有没有办法在REPL(jshell)上执行java命令作为内联命令而不启动它?

E.g。 Perl内联命令

$perl -e 'printf("%06d", 19)'
000019

我必须启动jshell才能运行任何命令:

$jshell
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro
jshell> String.format("%06d", 19)
$1 ==> "000019"

我发现了类似的问题here,但是为单个命令创建单独的jsh文件并不可行。

同一篇文章的另一个解决方案是:echo "1+2"|jshell

temp=`echo 'String.format("%06d", 19)'|jshell`
echo $temp

Ouch输出

| Welcome to JShell -- Version 9 | For an introduction type: /help intro jshell> String.format("%06d", 19) $1 ==> "000019" jshell>

我希望$temp仅打印000019

2 个答案:

答案 0 :(得分:1)

默认情况下,normal反馈模式用于与JShell的交互,此模式打印命令输出,声明,命令和提示。阅读Introduction to jshell feedback modes了解更多详情。

获取命令输出的步骤:

  1. jshell反馈模式下运行concise以跳过命令和声明详细信息,它仍会打印提示和值。

     $ echo 'String.format("%06d", 19)' | jshell --feedback concise
       jshell> String.format("%06d", 19)
       $1 ==> "000019"
    
  2. 使用sed -

    从结果中过滤第二行
    echo 'String.format("%06d", 19)' | jshell --feedback concise | sed -n '2p'
    
  3. 仅提取值并排除其他详细信息 -

    echo 'String.format("%06d", 19)' | jshell --feedback concise | sed -n '2p' |sed -En 's/[^>]*>(.+)/\1/gp'
    

答案 1 :(得分:0)

如果使用System.out.println,则不需要第二个sed

echo "System.out.println(\"$JAVA_HOME\");" | jshell --feedback concise | sed -n '2p'