BashスクリプトからJavaが(PATHまたはJava_HOMEを介して)利用可能かどうかを確認し、バージョンが少なくとも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
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で正常に動作するはずです。
Java -version
を発行し、出力を読み取って解析できます
Java -version 2>&1 >/dev/null | grep 'Java version' | awk '{print $3}'
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"
)を返します。
さまざまな答えの組み合わせ:
Java_VER=$(Java -version 2>&1 | grep -i version | sed 's/.*version ".*\.\(.*\)\..*"/\1/; 1q')
7
for Java 7および8
for Java 8最終的に使用した方法は次のとおりです。
# 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が何かに設定されている場合でも、正しく動作します。
私はこれが非常に古いスレッドであることを知っていますが、これは他の人の助けになるでしょう。
実行しているかどうかを確認するには、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
上記の回答は、特定のJavaバージョン(通常、Java 9より前のものまたはJava = 8。
Javaバージョン6から11の整数を返すシンプルなライナーを作成しました。
基本的に「1」をドロップします。バージョン番号が存在する場合、バージョン番号の先頭で、次の「。」の前の最初の番号のみを考慮します。
Java -version 2>&1 | head -1 | cut -d'"' -f2 | sed '/^1\./s///' | cut -d'.' -f1
同様の問題がありました。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
役に立つと証明されることを願っています
拡張bashバージョン( https://sourceforge.net/projects/bashj/ )であるbashjを使用すると、かなりコンパクトなソリューションが得られます。
#!/usr/bin/bashj
echo System.getProperty("Java.runtime.version")
答えは統合されたJVMによって提供されます(スクリプトの実行時間は〜0.017 ''で、呼び出し自体は〜0.004 ''です)。