我是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变量中的版本号吗?
答案 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"
}