我有一个调用java类方法的bash脚本。独立运行时,该方法将字符串返回到linux控制台。如何将java方法中的值赋值给bash脚本中的变量?
运行脚本:
java -cp /opt/my_dir/class.method [parameter]
输出:my_string
如果在bash脚本中添加:
read parameter
java -cp /opt/my_dir/class.method [parameter] | read the_output
echo $the_output
以上不起作用,我也尝试过失败:
the_output=java -cp /opt/my_dir/class.method [parameter]
the_output=`java -cp /opt/my_dir/class.method [parameter]`
java -cp /opt/my_dir/class.method [parameter] 2>&1
如何将输出存储到the_output变量中?
感谢。
答案 0 :(得分:3)
在Bash中:
$ the_output="$(java -cp /opt/my_dir/class.method [parameter])"
请参阅:http://www.gnu.org/software/bash/manual/bashref.html#Command-Substitution
修改强>:
实际上,看着你的命令行,我很惊讶它的工作原理。我以前没见过像这样的Java程序。通常,您只能从java命令运行main()方法。你的工作如何?
修改强>:
你说当你这样做时你仍然会输出到控制台。您可能还需要捕获stderr:
$ the_output="$(java -cp /opt/my_dir/class.method [parameter] 2>&1 )"
2>
表示重定向stderr(文件描述符2)。 &1
表示与stdout(文件描述符1)相同的位置。
答案 1 :(得分:1)
通过将命令包装在反引号中来使用command substitution。
答案 2 :(得分:0)
尝试 bashj (支持java的bash变种)https://sourceforge.net/projects/bashj/。
例如:
#!/usr/bin/bashj
X= Math.cos(0.5)
Y= Math.hypot(3.0,4.0)
Z= System.getProperty("java.runtime.version")
您也可以将自己的方法放在bashj加载的jar中,或者在bashj脚本中包含一些java源代码:
#!/usr/bin/bashj
#!java
public static int factorial(int n)
{if (n<=0) return(0);
if (n==1) return(1);
return(n*factorial(n-1));}
#@bash
echo j.factorial(10)
比任何涉及创建新JVM进程的解决方案快得多。