从BASH脚本检查Java版本的正确方法
如何检查bash脚本中的Java是否可用(在PATH中或通过JAVA_HOME),并确保版本至少为1.5?
10个解决方案
76 votes
也许像这样:
if type -p java; then
echo found java executable in PATH
_java=java
elif [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]]; then
echo found java executable in JAVA_HOME
_java="$JAVA_HOME/bin/java"
else
echo "no java"
fi
if [[ "$_java" ]]; then
version=$("$_java" -version 2>&1 | awk -F '"' '/version/ {print $2}')
echo version "$version"
if [[ "$version" > "1.5" ]]; then
echo version is more than 1.5
else
echo version is less than 1.5
fi
fi
glenn jackman answered 2020-01-09T18:28:47Z
45 votes
您可以通过以下方式获取Java版本:
JAVA_VER=$(java -version 2>&1 | sed -n ';s/.* version "\(.*\)\.\(.*\)\..*"/\1\2/p;')
它将为1.6.0_13提供给Java 16,为1.5.0_17提供给26953745510343649649。
因此,您可以轻松地在shell中进行比较:
[ "$JAVA_VER" -ge 15 ] && echo "ok, java is 1.5 or newer" || echo "it's too old..."
更新:如注释中所述,此代码与openjdk和JAVA_TOOL_OPTIONS应该可以正常工作。
Michał Šrajer answered 2020-01-09T18:29:21Z
16 votes
您可以发出java -version并读取和解析输出
java -version 2>&1 >/dev/null | grep 'java version' | awk '{print $3}'
Jigar Joshi answered 2020-01-09T18:29:40Z
5 votes
我编写了一个bash函数,该函数应适用于JDK 9和JDK 10。
#!/bin/bash
# returns the JDK version.
# 8 for 1.8.0_nn, 9 for 9-ea etc, and "no_java" for undetected
jdk_version() {
local result
local java_cmd
if [[ -n $(type -p java) ]]
then
java_cmd=java
elif [[ (-n "$JAVA_HOME") && (-x "$JAVA_HOME/bin/java") ]]
then
java_cmd="$JAVA_HOME/bin/java"
fi
local IFS=$'\n'
# remove \r for Cygwin
local lines=$("$java_cmd" -Xms32M -Xmx32M -version 2>&1 | tr '\r' '\n')
if [[ -z $java_cmd ]]
then
result=no_java
else
for line in $lines; do
if [[ (-z $result) && ($line = *"version \""*) ]]
then
local ver=$(echo $line | sed -e 's/.*version "\(.*\)"\(.*\)/\1/; 1q')
# on macOS, sed doesn't support '?'
if [[ $ver = "1."* ]]
then
result=$(echo $ver | sed -e 's/1\.\([0-9]*\)\(.*\)/\1/; 1q')
else
result=$(echo $ver | sed -e 's/\([0-9]*\)\(.*\)/\1/; 1q')
fi
fi
done
fi
echo "$result"
}
v="$(jdk_version)"
echo $v
对于Java 8("1.8.0_151"等),这将返回8,对于Java 9("9-Debian"等),将返回9,这将使进行进一步的比较更加容易。
Eugene Yokota answered 2020-01-09T18:30:05Z
4 votes
不同答案的组合:
JAVA_VER=$(java -version 2>&1 | grep -i version | sed 's/.*version ".*\.\(.*\)\..*"/\1/; 1q')
对于Java 7返回7,对于Java 8返回8
与OpenJDK和Oracle JDK一起使用
即使设置了JAVA_TOOL_OPTIONS也可以
user3193604 answered 2020-01-09T18:30:38Z
2 votes
我最终使用的方法是:
# Work out the JAVA version we are working with:
JAVA_VER_MAJOR=""
JAVA_VER_MINOR=""
JAVA_VER_BUILD=""
# Based on: http://stackoverflow.com/a/32026447
for token in $(java -version 2>&1 | grep -i version)
do
if [[ $token =~ \"([[:digit:]])\.([[:digit:]])\.(.*)\" ]]
then
JAVA_VER_MAJOR=${BASH_REMATCH[1]}
JAVA_VER_MINOR=${BASH_REMATCH[2]}
JAVA_VER_BUILD=${BASH_REMATCH[3]}
break
fi
done
即使将JAVA_TOOL_OPTIONS设置为某些值(由于grep进行的过滤),它也将正常工作。
Jinesh Choksi answered 2020-01-09T18:31:02Z
1 votes
我知道这是一个非常老的话题,但这对其他人还是有帮助的。
要知道您是在运行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]
Richard answered 2020-01-09T18:31:57Z
1 votes
我有一个类似的问题,我想检查安装了哪种版本的Java来执行两种类型的应用程序启动。以下代码解决了我的问题
jdk_version() {
local result
local java_cmd
if [[ -n $(type -p java) ]]
then
java_cmd=java
elif [[ (-n "$JAVA_HOME") && (-x "$JAVA_HOME/bin/java") ]]
then
java_cmd="$JAVA_HOME/bin/java"
fi
local IFS=$'\n'
# remove \r for Cygwin
local lines=$("$java_cmd" -Xms32M -Xmx32M -version 2>&1 | tr '\r' '\n')
if [[ -z $java_cmd ]]
then
result=no_java
else
for line in $lines; do
if [[ (-z $result) && ($line = *"version \""*) ]]
then
local ver=$(echo $line | sed -e 's/.*version "\(.*\)"\(.*\)/\1/; 1q')
# on macOS, sed doesn't support '?'
if [[ $ver = "1."* ]]
then
result=$(echo $ver | sed -e 's/1\.\([0-9]*\)\(.*\)/\1/; 1q')
else
result=$(echo $ver | sed -e 's/\([0-9]*\)\(.*\)/\1/; 1q')
fi
fi
done
fi
echo "$result"
}
_java="$(jdk_version)"
echo $_java
if [[ "$_java" > "$8" ]]; then
echo version is more than 8
else
echo version is less than 8
fi
资源
希望能对您有所帮助
vincenzopalazzo answered 2020-01-09T18:32:26Z
1 votes
以上答案仅适用于特定的Java版本(通常适用于Java 9之前的版本或Java 8之后的版本)。
我写了一个简单的线性脚本,它将为Java版本6至11返回一个整数。
它基本上删除了“ 1”。 在版本号的开头(如果存在),然后仅考虑下一个“。”之前的第一个数字。
java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1
dvlcube answered 2020-01-09T18:33:00Z
0 votes
使用扩展的bash版本bashj([https://sourceforge.net/projects/bashj/),],您将获得一个非常紧凑的解决方案:
#!/usr/bin/bashj
echo System.getProperty("java.runtime.version")
答案由集成的JVM提供(脚本的执行时间约为0.017英寸,调用本身的约为0.004英寸)。
Fil answered 2020-01-09T18:33:24Z