如何在Shell或Windows命令行中作为内联执行Java JShell命令

7
有没有办法在REPL (jshell)上执行Java命令,而不需要启动它?例如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

输出错误信息

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

我希望$temp只打印000019


可能是如何运行JShell文件?的重复问题。 - Naman
感谢您的建议。我查看了建议的帖子,但为每个命令创建单独的文件并不可行。一个人可能需要在不同的地方执行n个命令。 - Rahul Sharma
在同一篇帖子中,其中一个答案建议使用echo而不需要脚本。你试过了吗?“在不同的地方执行命令”是什么意思? - Naman
我尝试了,但响应不符合预期。请检查帖子。 - Rahul Sharma
我正在尝试将 $temp 分配为仅包含“3”的值,并排除其余信息。是否有选项可以跳过 jshell 打印版本信息? - Rahul Sharma
让我们在聊天中继续这个讨论。点击此处进入聊天室 - Rahul Sharma
2个回答

1

默认情况下,您与 JShell 交互时使用的是 normal 反馈模式,该模式会打印命令输出、声明、命令和提示。请阅读 介绍 jshell 反馈模式 以获取更多详细信息。

获取命令输出的步骤:

  1. 简洁 反馈模式运行 jshell,跳过命令和声明细节,它仍会打印提示和值。

     $ 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'
    

这个在Windows CMD / PowerShell命令行中能正常工作吗?我已经在Windows 10、JDK11上进行了测试,但是不起作用:JShell打开后会在jshell>命令上冻结。WSL也不起作用。 - lucasvc

-1
如果你使用 System.out.println,你将不需要第二个 sed。
echo "System.out.println(\"$JAVA_HOME\");" | jshell --feedback concise | sed -n '2p'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接