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

时间:2011-02-23 17:21:11

标签: 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

我如何将$ JAVA_VERSION与$ _STDOUT相匹配 当$ _STDOUT有多行时

4 个答案:

答案 0 :(得分:5)

你有一些问题。

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

    概念证明

    $ 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
    

答案 1 :(得分:1)

您可以使用Bash的内置比较检查器来查看字符串是否在另一个字符串中包含。因此,您无需管道awkcut

JAVA_VERSION=1.6.0_17
_STDOUT=`java -version 2>&1`
if [[ $_STDOUT == *$JAVA_VERSION* ]]; then
     echo "Matched"
else
     echo "Not Matched"
fi

答案 2 :(得分:0)

使用引号。

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

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

答案 3 :(得分:0)

问题不在于有多条线 - 即使输出出现在一条线上,它也不会匹配。你做了一个很好的尝试,但那个代码的作用就像比较苹果和一篮子水果。所以,我们需要将苹果从篮子中分离出来:))

我们就是这样做的:

注意:根据 SiegeX 的评论更正了代码

#!/bin/bash
JAVA_VERSION="1.6.0_17"
_STDOUT=`java -version 2>&1 | grep "java version" | cut -d'"' -f2` # Just extract the version

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