web-dev-qa-db-ja.com

チェックする正しい方法Java BASHスクリプトからのバージョン

BashスクリプトからJavaが(PATHまたはJava_HOMEを介して)利用可能かどうかを確認し、バージョンが少なくとも1.5であることを確認するにはどうすればよいですか?

52
Aaron Digulla

おそらく次のようなもの:

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
74
glenn jackman

Javaバージョンは次の方法で取得できます。

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

16 for Java like 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..."

PDATE:このコードは、コメントに記載されているopenjdkおよびJava_TOOL_OPTIONSで正常に動作するはずです。

45
Michał Šrajer

Java -versionを発行し、出力を読み取って解析できます

Java -version 2>&1 >/dev/null | grep 'Java version' | awk '{print $3}'
16
Jigar Joshi

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 etc)の場合は"1.8.0_151"、およびJava 9(9など)の場合は"9-Debian")を返します。

5
Eugene Yokota

さまざまな答えの組み合わせ:

Java_VER=$(Java -version 2>&1 | grep -i version | sed 's/.*version ".*\.\(.*\)\..*"/\1/; 1q')
  • 戻り値7 for Java 7および8 for Java 8
  • OpenJDKおよびOracle JDKで動作します
  • Java_TOOL_OPTIONSが設定されていても機能します
4
user3193604

最終的に使用した方法は次のとおりです。

# 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

Grepによるフィルタリングにより、Java_TOOL_OPTIONSが何かに設定されている場合でも、正しく動作します。

2
Jinesh Choksi

私はこれが非常に古いスレッドであることを知っていますが、これは他の人の助けになるでしょう。

実行しているかどうかを確認するには、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

1
Richard

上記の回答は、特定のJavaバージョン(通常、Java 9より前のものまたはJava = 8。

Javaバージョン6から11の整数を返すシンプルなライナーを作成しました。

基本的に「1」をドロップします。バージョン番号が存在する場合、バージョン番号の先頭で、次の「。」の前の最初の番号のみを考慮します。

Java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1

1
dvlcube

同様の問題がありました。2つのタイプのアプリケーションの起動を実行するために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

ソース

役に立つと証明されることを願っています

1
vincenzopalazzo

拡張bashバージョン( https://sourceforge.net/projects/bashj/ )であるbashjを使用すると、かなりコンパクトなソリューションが得られます。

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

答えは統合されたJVMによって提供されます(スクリプトの実行時間は〜0.017 ''で、呼び出し自体は〜0.004 ''です)。

0
Fil