从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_13
和15
像1.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
,Java8
返回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