使用sh shell比较字符串


197

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

这是一些代码:

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


首先,在Bourne Shell中,您不需要多余的';' 当我在Bourne shell中测试运行脚本时,if条件为false。它将首先发出警告:[:ABC:预期为整数表达式。输出为:“源系统不匹配ABC”。正如其他人所评论的,-eq用于整数比较。在Bourne shell(#!/ bin / sh)中使用单个等号进行字符串比较。您的外壳应该首先纠正了您。
周克敏

6
投票重新开放。引用的dups用于bash外壳,而不是贫血的sh外壳,有时是Posix外壳或Dash。
jww

1
同意,因此被投票。 shbash熊一样的关系CC++。即使为第一个代码编写的代码在第二个代码中有效,但第二个代码的答案也不能在第一个代码中使用。
btilly

Answers:


290

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

Sourcesystem="ABC"

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

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


2
不必引用ABCXYZ
ceving 2013年

29
如果您的变量中可能有空格,则需要加引号。
威廉·埃弗里特

1
调整了示例,以使该部分更清晰@WilliamEverett。
Per Lundberg


36

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

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

祝好运


注意:如果要比较变量,请确保使用"$VAR"而不是简单使用$VAR
Sridhar Sarnobat,


10

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


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

18
请注意,运算符==并非在每个shell上都起作用。=是用于比较字符串的正确运算符,==有时是同义词。
Omer Dagan

3

在我测试的4个shell ABC -eq XYZ中,test内置的forzsh和评估为true ksh。该表达式的计算结果为false under /usr/bin/test,并且内置了fordashbash。在kshzsh,字符串被转换为数字值并等于因为它们都是0 IMO,所述内建为的行为kshzsh不正确,但对于规格test是不明确这一点。


1
感谢您的测试。这就是Bourne外壳受欢迎的原因。
周克敏

zsh清楚地输出使用[或内置测试后,期望的整数表达式。也许您正在强迫[[由于字符串不是有效整数,所以两者均得出0 。
code933k

@ code933k哪个版本?如果行为发生变化,我也不会感到惊讶。
威廉·珀塞尔

@WilliamPursell zsh 5.7.1
code933k '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.