从BASH脚本检查Java版本的正确方法

如何从bash脚本中检查Java是否可用(在PATH中或通过JAVA_HOME)并确保版本至less为1.5?

也许是这样的:

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 

你可以通过以下方式获得java版本

 JAVA_VER=$(java -version 2>&1 | sed -n ';s/.* version "\(.*\)\.\(.*\)\..*"/\1\2/p;') 

它会给你16像Java 1.6.0_13151.5.0_17版本。

所以你可以很容易地在shell中比较它:

 [ "$JAVA_VER" -ge 15 ] && echo "ok, java is 1.5 or newer" || echo "it's too old..." 

更新:这个代码应该正常工作与openjdk和JAVA_TOOL_OPTIONS中所述的评论。

您可以发出java -version并读取&parsing输出

 java -version 2>&1 >/dev/null | grep 'java version' | awk '{print $3}' 

我最终使用的方法是:

 # 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所做的过滤而导致的问题,它也能正常工作。

不同答案的组合:

 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也可以工作

我知道这是一个非常古老的线索,但这对他人仍然有帮助。

要知道您是在运行Java 5,6或7,首先键入java -version

在你的输出中会有一行看起来类似于: java version“1.7.0_55”

然后你使用这个表格将“行话”结果转换成版本号。

1.7.0_55是Java 7
Java 1.6是1.6.0_75
1.5.0_65是Java 5

从Oracle网站上的页面获取的信息
http://www.oracle.com/technetwork/java/javase/7u55-relnotes-2177812.html