如何从bash脚本检查Java是否可用(在PATH中或通过JAVA_HOME)并确保版本至少为1.5?
答案 0 :(得分:71)
也许是这样的:
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
答案 1 :(得分:45)
您可以通过以下方式获取java版本:
JAVA_VER=$(java -version 2>&1 | sed -n ';s/.* version "\(.*\)\.\(.*\)\..*"/\1\2/p;')
它会为16
等1.6.0_13
提供15
和1.5.0_17
等版本[ "$JAVA_VER" -ge 15 ] && echo "ok, java is 1.5 or newer" || echo "it's too old..."
。
所以你可以在shell中轻松比较它:
{{1}}
<强>更新强> 这段代码应该可以正常使用openjdk和JAVA_TOOL_OPTIONS,如评论中所述。
答案 2 :(得分:16)
您可以发出java -version
并阅读&amp;解析输出
java -version 2>&1 >/dev/null | grep 'java version' | awk '{print $3}'
答案 3 :(得分:5)
不同答案的组合:
JAVA_VER=$(java -version 2>&1 | grep -i version | sed 's/.*version ".*\.\(.*\)\..*"/\1/; 1q')
7
和Java 8的8
答案 4 :(得分:5)
我编写了一个适用于JDK 9和JDK 10的bash函数。
#!/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(8
等)返回"1.8.0_151"
,为Java 9(9
等)返回"9-Debian"
,这样可以更容易地进行进一步的比较
答案 5 :(得分:2)
我最终使用的方法是:
# 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过滤而设置为某种东西,它也能正常工作。
答案 6 :(得分:2)
您还可以将jdk类的版本号与javap
进行比较:
javap -verbose java.lang.String | grep "major version" | cut -d " " -f5
如果它的Java 8,它将为Java 11打印52和55。这样,您可以进行简单的比较,而不必处理版本字符串解析。
答案 7 :(得分:1)
我知道这是一个非常古老的帖子,但这对其他人来说仍然有帮助。
要知道您是在运行Java 5,6还是7,首先输入java -version
。
输出中会有一行看起来与此类似: java版“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
答案 8 :(得分:1)
我有一个类似的问题,我想检查安装了哪种版本的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
我希望能被证明有用
答案 9 :(得分:1)
java -version |& grep 'version' |& awk -F\" '{ split($2,a,"."); print a[1]"."a[2]}'
#!/bin/bash
echo `java -version 2>&1 | grep 'version' 2>&1 | awk -F\" '{ split($2,a,"."); print a[1]"."a[2]}'`
jver=`java -version 2>&1 | grep 'version' 2>&1 | awk -F\" '{ split($2,a,"."); print a[1]"."a[2]}'`
if [[ $jver == "1.8" ]]; then
echo $jver is java 8
else
echo $jver is java 11
fi
在SUN和Linux中工作
答案 10 :(得分:1)
这里有一个不错的可移植bash函数:http://eed3si9n.com/detecting-java-version-bash
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"
}
答案 11 :(得分:0)
使用bashj,一个扩展的bash版本(https://sourceforge.net/projects/bashj/),你会得到一个相当紧凑的解决方案:
#!/usr/bin/bashj
echo System.getProperty("java.runtime.version")
答案由集成的JVM提供(脚本的执行时间约为0.017,执行时间为〜{0.004&#39;&#39;用于调用本身)。
答案 12 :(得分:0)
以上答案仅适用于特定的Java版本(通常适用于Java 9之前的版本或Java 8之后的版本。
我写了一个简单的线性代码,它将为Java版本6至11返回一个整数。
基本上删除了“ 1”。在版本号的开头(如果存在),然后仅考虑下一个“。”之前的第一个数字。
java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1
答案 13 :(得分:0)
另一种方法是:
release
中有一个名为$JAVA_HOME
的文件。
在Java 15(Debian)上,它具有以下内容:
IMPLEMENTOR="Debian"
JAVA_VERSION="15.0.1"
JAVA_VERSION_DATE="2020-10-20"
MODULES="java.base java.compiler java.datatransfer java.xml java.prefs java.desktop java.instrument java.logging java.management java.security.sasl java.naming java.rmi java.management.rmi java.net.http java.scripting java.security.jgss java.transaction.xa java.sql java.sql.rowset java.xml.crypto java.se java.smartcardio jdk.accessibility jdk.internal.vm.ci jdk.management jdk.unsupported jdk.internal.vm.compiler jdk.aot jdk.internal.jvmstat jdk.attach jdk.charsets jdk.compiler jdk.crypto.ec jdk.crypto.cryptoki jdk.dynalink jdk.internal.ed jdk.editpad jdk.hotspot.agent jdk.httpserver jdk.incubator.foreign jdk.internal.opt jdk.jdeps jdk.jlink jdk.incubator.jpackage jdk.internal.le jdk.internal.vm.compiler.management jdk.jartool jdk.javadoc jdk.jcmd jdk.management.agent jdk.jconsole jdk.jdwp.agent jdk.jdi jdk.jfr jdk.jshell jdk.jsobject jdk.jstatd jdk.localedata jdk.management.jfr jdk.naming.dns jdk.naming.rmi jdk.net jdk.nio.mapmode jdk.sctp jdk.security.auth jdk.security.jgss jdk.unsupported.desktop jdk.xml.dom jdk.zipfs"
OS_ARCH="x86_64"
OS_NAME="Linux"
SOURCE=""
所以您看到JAVA_VERSION
,其中包含版本号。
例如,
major=$(echo $JAVA_VERSION | cut -d. -f1)
将major
设置为值15(=主版本号),您可以进一步使用它。
这是一个非常简单的解决方案。
答案 14 :(得分:0)
我发现以下效果很好。它是来自Michał Šrajer和jmj
的答案的组合version=$(java -version 2>&1 | sed -n ';s/.* version "\(.*\)\.\(.*\)\..*"/\1\2/p;' | awk '{ print $1 }')
。
我已经安装了 openJDK 13 并且没有 awk
命令打印第一个答案:130 2020-01-14
。因此,添加 awk '{ print $1 }'
只为我提供了版本。
答案 15 :(得分:0)
仅使用带有 Perl 风格正则表达式的 grep 来确定 Java 版本可以这样完成:
java -version 2>&1 | grep -oP 'version "?(1\.)?\K\d+'
这将打印 Java 9 或更高版本的主要版本和版本低于 9 的次要版本,例如 8
用于 Java 1.8
和 11
用于 Java {{1} }.
可以这样使用:
11.0.4
添加了 JAVA_MAJOR_VERSION=$(java -version 2>&1 | grep -oP 'version "?(1\.)?\K\d+' || true)
if [[ $JAVA_MAJOR_VERSION -lt 8 ]]; then
echo "Java 8 or higher is required!"
exit 1
fi
以防止脚本在未安装 Java 且启用了 Shell 选项 || true
的情况下中止。