从 BASH 脚本检查 Java 版本的正确方法
如何从 bash 脚本检查 Java 是否可用(在 PATH 中或通过 JAVA_HOME)并确保版本至少为 1.5?
How can I check whether Java is available (in the PATH or via JAVA_HOME) from a bash script and make sure the version is at least 1.5?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(20)
也许是这样的:
Perhaps something like:
您可以通过以下方式获取java版本:
对于java,它会给您
16
,如1.6.0_13
,对于15
版本,如1.5.0_17
、110
用于openjdk 11.0.6 2020-01-14 LTS
和210
用于java 版本 21 2023-09-19 LTS
。所以你可以轻松地在 shell 中比较它:
更新:
如评论中所述,此代码应该可以与 openjdk 和
JAVA_TOOL_OPTIONS
正常工作。You can obtain java version via:
it will give you
16
for java like1.6.0_13
,15
for version like1.5.0_17
,110
foropenjdk 11.0.6 2020-01-14 LTS
and210
forjava version 21 2023-09-19 LTS
.So you can easily compare it in shell:
UPDATE:
This code should work fine with openjdk and
JAVA_TOOL_OPTIONS
as mentioned in the comments.上面的答案仅适用于特定的 Java 版本(通常适用于 Java 9 之前的版本或 Java 8 之后的版本)。
我编写了一个简单的单行代码,它将返回 Java 版本 6 到 11 的整数(可能还有所有未来版本,直到他们再次更改它!)。
它基本上会删除版本号开头的“1.”(如果存在),然后仅考虑下一个“.”之前的第一个数字
。 &1 |头 -1 | 剪切 -d'"' -f2 | sed '/^1\./s///' | 剪切 -d'.'
The answers above work correctly only for specific Java versions (usually for the ones before Java 9 or for the ones after Java 8.
I wrote a simple one liner that will return an integer for Java versions 6 through 11 (and possibly all future versions, until they change it again!).
It basically drops the "1." at the beginning of the version number, if it exists, and then considers only the first number before the next ".".
java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1
您可以发出
java -version
并读取 &解析输出You can issue
java -version
and read & parse the output您还可以将jdk类版本号与
javap
进行比较:如果是java 8,则会打印52,而对于java 11,则会打印55。有了这个,您可以进行简单的比较,而不必处理版本字符串解析。
You could also compare the jdk class version number with
javap
:If its java 8, this will print 52, and 55 for java 11. With this you can make a simple comparison and you don't have to deal with the version string parsing.
我编写了一个适用于 JDK 9 和 JDK 10 的 bash 函数。
对于 Java 8(
"1.8.0_151"
等),这将返回8
,而9< /code> for Java 9(
"9-Debian"
等),这应该更容易进行进一步的比较。I wrote a bash function that should work for JDK 9 and JDK 10.
This returns
8
for Java 8 ("1.8.0_151"
etc), and9
for Java 9 ("9-Debian"
etc), which should make it easier to do the further comparison.仅使用带有 Perl 样式正则表达式的 grep 来确定 Java 版本可以如下完成:
这将打印 Java 9 或更高版本的主要版本以及低于 9 的版本的次要版本,例如
8
for Java1.8
和 Java11.0.4
的11
。它可以像这样使用:
||添加 true
是为了防止在未安装 Java 且启用了 Shell 选项set -e
的情况下脚本中止。Determining the Java version only using grep with Perl-style regex can be done like this:
This will print the major version for Java 9 or higher and the minor version for versions lower than 9, for example
8
for Java1.8
and11
for Java11.0.4
.It can be used like this:
The
|| true
was added to prevent the script from aborting in case Java is not installed and the Shell optionset -e
was enabled.不同答案的组合:
7
,对于 Java 88
适用于 OpenJDK 和 Oracle JDKA combination of different answers:
7
for Java 7 and8
for Java 8适用于 SUN 和 Linux
Works in SUN and Linux
我最终使用的方法是:
即使由于 grep 完成的过滤而将 JAVA_TOOL_OPTIONS 设置为某些内容,它也会正常工作。
The method I ended up using is:
It will work correctly even if JAVA_TOOL_OPTIONS is set to something due to filtering done by grep.
另一种方法是:
名为
release
的文件位于$JAVA_HOME
中。在 Java 15 (Debian) 上,它的内容为:
因此您会看到
JAVA_VERSION
,其中包含版本号。例如,
将
major
设置为值 15(=主版本号),您可以进一步使用该值。这是一个非常简单的解决方案。
Another way is:
A file called
release
is located in$JAVA_HOME
.On Java 15 (Debian) it has as content:
So you see
JAVA_VERSION
, which contains the version number.For example,
sets
major
to the value 15 (=Major version number), which you can use further.It's a really simple solution.
使用 Bash 的内置解析功能获取 java 版本字符串:
示例
系统默认 Java 17:
作为参数提供的特定 Java 8 路径:
Getting java version string, using Bash's built-in parsing capabilities:
Examples
System default Java 17:
Specific Java 8 path provided as argument:
我有一个类似的问题,我想检查安装了哪个版本的java来执行两种类型的应用程序启动。
下面的代码解决了我的问题
来源
我希望能被证明是有帮助的< /em>
I had a similar problem, I wanted to check which version of java was installed to perform two types of application launches.
The following code has solved my problem
source
I hope to be proved helpful
这里有一个很好的便携式 bash 函数: http://eed3si9n.com/detecting-java -版本-bash
There is a nice portable bash function for this here: http://eed3si9n.com/detecting-java-version-bash
我知道这是一个非常古老的线程,但这仍然对其他人有帮助。
要了解您运行的是 Java 5、6 还是 7,请首先输入
java -version
。输出中将有一行看起来与此类似: java version "1.7.0_55"
然后,您使用此表将“行话”结果转换为版本号。
1.7.0_55 是 Java 7
1.6.0_75 是 Java 6
1.5.0_65 是 Java 5
信息取自 Oracle 站点上的页面
http://www.oracle.com/technetwork/java/javase /7u55-relnotes-2177812.html
I know this is a very old thread but this will still be of help to others.
To know whether you're running Java 5, 6 or 7, firstly type
java -version
.There will be a line in your output that looks similar to this: java version "1.7.0_55"
Then you use this table for converting the 'jargon' result to the version number.
1.7.0_55 is Java 7
1.6.0_75 is Java 6
1.5.0_65 is Java 5
Information taken from a page on the Oracle site
http://www.oracle.com/technetwork/java/javase/7u55-relnotes-2177812.html
使用 bashj,扩展的 bash 版本 (https://sourceforge.net/projects/bashj/) ,您会得到一个相当紧凑的解决方案:
答案由集成的 JVM 提供(脚本的执行时间约为 0.017 英寸,调用本身的执行时间约为 0.004 英寸)。
Using bashj, an extended bash version (https://sourceforge.net/projects/bashj/), you get a rather compact solution:
The answer is provided by an integrated JVM (in ~0.017'' execution time for the script , and ~0.004'' for the call itself).
我发现以下作品相当不错。它是 Michał Šrajer 和 jmj
version=$(java -version 2>&1 | sed -n ';s/.* 版本 "\(.*\)\.\(.*\)\..*"/\1\2/p;' | awk '{ print $1 }')
.我安装了 openJDK 13,如果没有
awk
命令,第一个答案会打印:130 2020-01-14
。因此,添加awk '{ print $1 }'
只为我提供了版本。I found the following works rather well. It is a combination of the answers from Michał Šrajer and jmj
version=$(java -version 2>&1 | sed -n ';s/.* version "\(.*\)\.\(.*\)\..*"/\1\2/p;' | awk '{ print $1 }')
.I have openJDK 13 installed and without the
awk
command the first answer printed:130 2020-01-14
. Thus, addingawk '{ print $1 }'
provides me with just the version.这个问题仍然相关,所以发布我的答案。
使用稍微复杂的方式,使用内置的 Bash 变量扩展并避免创建多个子 shell
对于 Java 1.8.0_312 返回 8,对于 17.0.6 返回 17
这可以在如下脚本中使用
This question is still relevant so posting my answer.
Using slightly convoluted way by using built-in Bash variable expansions and avoiding creating multiple sub-shells
Returns 8 for Java 1.8.0_312 and 17 for 17.0.6
This can be used in a script like below
您可以使用 ps -ef | 获取进程 ID grep -v grep | grep -v grep java
然后使用 jcmd process_id vm.version
You can get the process ID by using ps -ef | grep -v grep | grep java
and then use jcmd process_id vm.version
在 bash 中检查所需的最低 Java 版本的一行代码:
退出代码指示 Java 17+ 是否可用。请注意,这需要一个(临时)文件
a.java
。One-liner to check for a minimum required Java version in bash:
The exitcode indicates if Java 17+ is available. Note that this requires a (temp) file
a.java
.