228

我正在使用 SH shell,我正在尝试将字符串与变量的值进行比较,但if条件始终执行为真。为什么?

这是一些代码:

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 或空字符串匹配吗?

4

7 回答 7

327

您应该使用=运算符进行字符串比较:

Sourcesystem="ABC"

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

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

于 2012-06-01T11:24:24.150 回答
90

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

于 2012-06-01T11:24:19.660 回答
45

eq 用于比较整数,使用 equal '=' 代替,例如:

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

祝你好运

于 2017-05-02T14:37:54.473 回答
30

我有同样的问题,这样做

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

注意空格。=在这种情况下,在符号前后使用空格很重要。

查看“其他比较运算符”。

于 2014-09-24T06:55:47.840 回答
12

-eq是用于比较整数的 shell 比较运算符。要比较字符串,您需要使用=.

于 2012-06-01T11:25:15.427 回答
4

-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
于 2012-06-01T11:25:12.803 回答
3

在我测试过的 4 个 shell 中, ABC -eq XYZtestforzshksh. /usr/bin/test该表达式在and 的内置函数下计算dash为false bash。在kshandzsh中,字符串被转换为数值并且相等,因为它们都是 0。IMO,kshand的内置函数的行为zsh是不正确的,但是 for 的规范test在这方面是模棱两可的。

于 2012-06-01T14:10:22.157 回答