大家。我一直试图理解脚本的这一行,但我真的无法理解。我是bash脚本的新手,所以这很难:(
java -version 2>&1 |awk 'NR==1{ gsub(/"/,""); print $3 }'
我会大量宣传
答案 0 :(得分:5)
java -version 2>&1
使用参数java
运行-version
。这意味着,它告诉Java运行时打印其版本。 2>&1
是一个重定向,它使stderr
文件描述符(通常用于记录和人类可读文本)写入与stdout
相同的目标(通常用于机器解析输出),这样人类可读的文本(例如我们的版本号!)就会通过管道。|
将左侧命令的输出连接到右侧命令的输入。awk 'NR==1{ gsub(/"/,""); print $3 }'
调用文本处理程序awk
,其中包含用于解析输出的程序,该程序执行以下操作:
NR == 1
表示以下代码仅针对第一行输入gsub(/"/, "")
从输入中删除文字双引号。print $3
打印给定输入行的第三个字段。就个人而言,我会写如下:
# uses only bash builtins; first two _s are placeholders for the words we don't care about
IFS=' "' read -r _ _ version < <(java -version 2>&1)
...之后,echo "$version"
将发布您的Java版本。
更好,脆弱性更低:
#!/bin/bash
java_version_re='^java version "([^"]+)"'
if [[ $(java -version 2>&1) =~ $java_version_re ]]; then
version=${BASH_REMATCH[1]}
echo "Detected java version as $version" >&2
else
echo "Could not detect java version" >&2
fi
此版本可以检测输出何时正确的Java版本字符串,而原始版本不能。
答案 1 :(得分:1)
最简单的方法是分解部分:
java -version 2&gt;&amp; 1 为您提供java版本:
openjdk version "1.8.0_111"
OpenJDK Runtime Environment (build 1.8.0_111-b16)
OpenJDK 64-Bit Server VM (build 25.111-b16, mixed mode)
awk'NR == 1'为您提供第一行:
openjdk version "1.8.0_111"
打印$ 3 为您提供第三个字:
"1.8.0_111"
最后 gsub(/“/,”“)剥离了”charachter:
1.8.0_111
答案 2 :(得分:0)
Awk解析第一行输入,然后删除双引号并打印第三个字段。
Awk是一种自己的编程语言,只是假装它是bash
你不会理解它