我有一个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有多行时
答案 0 :(得分:5)
你有一些问题。
java -version
将其输出放在STDERR上,而不是STDOUT,因此您必须将STDERR重定向到STDOUT才能解析它。 JAVA_VERSION="1.6.0_17"
shell将删除引号,您可以将双引号括在单引号中以使它们成为文字。 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
$ 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的内置比较检查器来查看字符串是否在另一个字符串中包含。因此,您无需管道awk
或cut
。
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