我如何用bash脚本中的变量解析多行stdout字符串,我收到错误"一元运算符预期"

kam*_*mal 0 bash scripting

我有一个bash脚本:


#!/bin/bash
JAVA_VERSION="1.6.0_17"
_STDOUT=`java -version`

if [ $JAVA_VERSION = $_STDOUT ]; then
        echo "Matched"
else
        echo "Not Matched"
fi

我得到了结果:

java version "1.6.0_17"
OpenJDK Runtime Environment (IcedTea6 1.7.5) (rhel-1.16.b17.el5-x86_64)
OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode)
t4.sh: line 8: [: 1.6.0_17: unary operator expected
Not Matched

$ _STDOUT有多行时,如何将$ JAVA_VERSION与$ _STDOUT匹配

Sie*_*geX 5

你有一些问题.

  1. 它似乎java -version将其输出放在STDERR上,而不是STDOUT,因此您必须将STDERR重定向到STDOUT以解析它.
  2. 你需要字面上匹配双引号.使用JAVA_VERSION="1.6.0_17"shell将删除引号,您可以用单引号将双引号括起来使它们成为文字.
  3. 最后,如果你要使用,bash你应该使用[[ ]]而不是[ ].后者实际上是test内置的同义词,前者是本机语法,允许更多功能; 其中一个是你不需要引用里面的变量.

.

#!/bin/bash

JAVA_VERSION='"1.6.0_17"'
_STDOUT=$(java -version 2>&1 | awk 'NR==1{print $3}')

if [[ $JAVA_VERSION = $_STDOUT ]]; then
  echo "Matched"
else
  echo "Not Matched"
fi
Run Code Online (Sandbox Code Playgroud)

概念证明

$ java -version
java version "1.6.0_20"
Java(TM) SE Runtime Environment (build 1.6.0_20-b02)
Java HotSpot(TM) Client VM (build 16.3-b01, mixed mode, sharing)

$ JAVA_VERSION='"1.6.0_20"'; _STDOUT=$(java -version 2>&1 | awk 'NR==1{print $3}'); if [[ $JAVA_VERSION = $_STDOUT ]]; then echo "Matched"; else echo "Not Matched"; fi
Matched

$ JAVA_VERSION='"1.6.0_19"'; _STDOUT=$(java -version 2>&1 | awk 'NR==1{print $3}'); if [[ $JAVA_VERSION = $_STDOUT ]]; then echo "Matched"; else echo "Not Matched"; fi
Not Matched
Run Code Online (Sandbox Code Playgroud)