什么是"java -version 2>&1 | awk'NR == 1 {gsub(/"/,""); 打印$ 3}'"做什么?

Los*_*ost -2 bash awk

大家.我一直试图理解脚本的这一行,但我真的不能.我是bash脚本的新手,所以它很难:(

java -version 2>&1 |awk 'NR==1{ gsub(/"/,""); print $3 }'
Run Code Online (Sandbox Code Playgroud)

我会说很多

Cha*_*ffy 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)
Run Code Online (Sandbox Code Playgroud)

...之后,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
Run Code Online (Sandbox Code Playgroud)

此版本可以检测输出何时不是正确的Java版本字符串,而原始版本不能.