Forma correcta de verificar la versión de Java desde el script de BASH

¿Cómo puedo verificar si Java está disponible (en PATH o vía JAVA_HOME) desde un script bash y me aseguro de que la versión sea al menos 1.5?

Quizás algo como:

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 

Puede obtener la versión de Java a través de:

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

le dará 16 para java como 1.6.0_13 y 15 para versión como 1.5.0_17 .

Entonces puedes compararlo fácilmente en shell:

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

ACTUALIZACIÓN: Este código debería funcionar bien con openjdk y JAVA_TOOL_OPTIONS como se menciona en los comentarios.

Puede emitir java -version y leer y analizar la salida

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

Una combinación de diferentes respuestas:

 JAVA_VER=$(java -version 2>&1 | grep -i version | sed 's/.*version ".*\.\(.*\)\..*"/\1/; 1q') 
  • Devuelve 7 para Java 7 y 8 para Java 8
  • Funciona con OpenJDK y con Oracle JDK
  • Funciona incluso si se establece JAVA_TOOL_OPTIONS

Escribí una función bash que debería funcionar para JDK 9 y 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 

Esto devuelve 8 para Java 8 ( "1.8.0_151" etc.) y 9 para Java 9 ( "9-Debian" etc.), lo que debería facilitar la comparación.

El método que terminé usando es:

 # 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 

Funcionará correctamente incluso si JAVA_TOOL_OPTIONS está configurado en algo debido al filtrado realizado por grep.

Sé que este es un hilo muy antiguo, pero esto ayudará a otros.

Para saber si está ejecutando Java 5, 6 o 7, primero escriba java -version .

Habrá una línea en su salida que se parece a esto: versión de Java “1.7.0_55”

Luego usa esta tabla para convertir el resultado ‘jerga’ al número de versión.

1.7.0_55 es Java 7
1.6.0_75 es Java 6
1.5.0_65 es Java 5

Información tomada de una página en el sitio de Oracle
http://www.oracle.com/technetwork/java/javase/7u55-relnotes-2177812.html

Usando bashj, una versión extendida de bash ( https://sourceforge.net/projects/bashj/ ), obtienes una solución bastante compacta:

 #!/usr/bin/bashj echo System.getProperty("java.runtime.version") 

La respuesta la proporciona una JVM integrada (en ~ 0.017 ” tiempo de ejecución para la secuencia de comandos y ~ 0.004 ” para la misma llamada).