使用bash脚本更新JAVA_HOME

时间:2019-05-28 18:30:26

标签: bash shell

我是bash脚本的新手,因此这个问题, 我有一个功能,可以在系统中安装Java并更新bashrc中的路径。

install_java(){
  echo "Installing Java 8 & 11 and setting JAVA_HOME to 8"
  brew tap adoptopenjdk/openjdk
  brew cask install adoptopenjdk8
  brew cask install adoptopenjdk11
  echo "export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_131.jdk/Contents/Home"
}

我想用java -version的输出更新硬编码的版本字符串 这是我的java -version

输出
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)

有人可以帮我从第一行中提取版本号,以代替JAVA_HOME变量中的版本号吗?

1 个答案:

答案 0 :(得分:1)

此处使用java -version|grep -oP 'java version\s"\K[^"]+'解析Java版本,并将其存储在java_ver变量中,然后替换为JAVA_HOME分配。

install_java(){
  echo "Installing Java 8 & 11 and setting JAVA_HOME to 8"   
  brew tap adoptopenjdk/openjdk
  brew cask install adoptopenjdk8
  brew cask install adoptopenjdk11
  java_ver=$(java -version 2>&1|grep -oP 'version\s"\K[^"]+')
  echo "export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk${java_ver}.jdk/Contents/Home"
}

java -version 2>&1|grep -oP 'version\s"\K[^"]+'的解释:

grep -o:这只会提取匹配内容而不是匹配行,-P标志启用PCRE,现在正则表达式是Java版本,后跟空格(\s)然后跟随"直到看到下一个"。另外,请忽略\K左侧的所有内容。

如果您的grep尚未启用-P,则可以使用awk命令:

install_java(){
  echo "Installing Java 8 & 11 and setting JAVA_HOME to 8"   
  brew tap adoptopenjdk/openjdk
  brew cask install adoptopenjdk8
  brew cask install adoptopenjdk11
  java_ver=$(java -version 2>&1|awk '/version/{gsub(/"/,"",$NF);print $NF}')
  echo "export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk${java_ver}.jdk/Contents/Home"
}