2012-06-01 64 views
103

我正在使用SH shell,我试图比较一个字符串与变量的值,但if条件始终执行为true。为什么?比较Unix中的一个字符串

下面是一些代码:

Sourcesystem="ABC" 

if [ "$Sourcesystem" -eq 'XYZ' ]; then 
    echo "Sourcesystem Matched" 
else 
    echo "Sourcesystem is NOT Matched $Sourcesystem" 
fi; 

echo Sourcesystem Value is $Sourcesystem ; 

即使这是行不通的:

Sourcesystem="ABC" 

if [ 'XYZ' -eq "$Sourcesystem" ]; then 
    echo "Sourcesystem Matched" 
else 
    echo "Sourcesystem is NOT Matched $Sourcesystem" 
fi; 

echo Sourcesystem Value is $Sourcesystem ; 

其次,我们可以匹配这个用NULL或空字符串?

+0

首先在Bourne Shell中你不需要额外的 ';'当我测试在Bourne shell中运行脚本时,if条件为false。它会首先发出警告:[:ABC:预期的整数表达式。输出是:“Sourcesystem不符合ABC”。正如其他人所评论的,-eq用于整数比较。在Bourne shell中使用单个等号进行字符串比较(#!/ bin/sh)。你的外壳本来应该纠正你。 –

回答

46

-eq用于比较整数。改为使用=

167

您应该使用=操作字符串比较:

Sourcesystem="ABC" 

if [ "$Sourcesystem" = "XYZ" ]; then 
    echo "Sourcesystem Matched" 
else 
    echo "Sourcesystem is NOT Matched $Sourcesystem" 
fi; 

man test说,你用-z以匹配空字符串。

+1

没有必要引用ABC或XYZ。 – ceving

+8

如果你的变量可能有空格,那么引用是必要的。 –

+0

调整了示例以使该部分更清晰@WilliamEverett。 –

5

-eq是一个数学比较算子。我从来没有用它来比较字符串,依靠==!=进行比较。

if [ 'XYZ' == 'ABC' ]; then # Double equal to will work in Linux but not on HPUX boxes it should be if [ 'XYZ' = 'ABC' ] which will work on both 
    echo "Match" 
else 
    echo "No Match" 
fi 
+5

请注意,运算符“==”在每个shell上都不起作用。 '='是用来比较字符串的正确运算符,'=='有时是同义词。 –

3

-eq是比较整数的shell比较运算符。为了比较字符串,你需要使用=

+6

-1:不要使用'=='。它只在有限的一组壳中有效,并且会产生未指定的行为。 –

1

在我测试的4个壳体中,ABC -eq XYZtest内建中对于zshksh评估为真。该表达式在/usr/bin/testdashbash的内建值下评估为false。在kshzsh中,字符串被转换为数值并且相等,因为它们都是0. IMO,kshzsh的内置函数的行为不正确,但test的规范在​​此上不明确。

+0

感谢您的测试。这就是Bourne shell受欢迎的原因。 Dockerfile中的 –

11

我有同样的问题,做到这一点

if [ 'xyz' = 'abc' ]; 
then 
echo "match" 
fi 

公告空白。在这种情况下,在=符号之前和之后使用空格是非常重要的。

查看“Other Comparison Operators”。

+1

:/ bin/sh:1:[:=:意外运算符 – holms

6

EQ用来比较整数使用等于 '=' 代替, 例如:

if [ 'AAA' = 'ABC' ]; 
then 
    echo "the same" 
else 
    echo "not the same" 
fi 

好运