如何比较bash中if条件中的两个string

s="STP=20" if [[ "$x" == *"$s"* ]] 

if条件总是假的; 为什么?

试试这个: http : //tldp.org/LDP/abs/html/comparison-ops.html

 string comparison = is equal to if [ "$a" = "$b" ] 

[ ... ][[ ... ]]之间的平等进行测试是有区别的。

[ ... ]test命令的别名:

STRING1 = STRING2 的字符串是相等的

但是,使用[[ ... ]]

当使用==!=运算符时,运算符右侧的字符串被视为一个模式,并根据模式匹配下面描述的规则进行匹配。 如果启用shell选项nocasematch,则不考虑字母字符的情况下执行匹配。 如果字符串匹配( == )或不匹配( != )模式,则返回值为0,否则返回1。 模式的任何部分可能被引用来强制它被匹配为一个字符串。

只有=符号似乎也是如此:

 $ foo=bar $ if [[ $foo = *ar ]] > then > echo "These patterns match" > else > echo "These two strings aren't equal" > fi These patterns match 

注意不同之处:

 $ foo=bar > if [ $foo = *ar ] > then > echo "These patterns match" > else > echo "These two strings aren't equal" > fi These two strings aren't equal 

但是,有一些陷阱使用[ $f00 = *ar ]语法。 这是一样的:

 test $foo = *ar 

这意味着shell在执行语句之前会插入glob表达式和变量。 如果$foo为空,则该命令将等同于:

 test = *ar # or [ = *ar ] 

由于=test不是有效的比较运算符,所以会出现如下错误:

 bash: [: =: unary operator expected 

这意味着[期待在test页中找到参数。

而且,如果我碰巧在我的目录中有一个文件bar ,那么shell将会替换与该模式匹配的所有文件(在本例中为bar ),所以命令将变为:

 [ $foo = bar ] 

这是真的。

为了解决各种问题,你应该总是把参数引用。 这将阻止shell插入球体,并将帮助没有值的变量:

 [ "$foo" = "*ar" ] 

这将测试变量$foo是否等于字符串*ar 。 即使$foo为空也是可行的,因为引号会强制空字符串比较。 *ar引号会阻止shell插入glob。 这是一个真正的平等。

当然,如果您在使用[[ ... ]]时使用引号,则会强制执行字符串匹配:

 foo=bar if [[ $foo == "*ar" ]] then echo "This is a pattern match" else echo "These strings don't match" fi 

所以,最后,如果你想测试字符串相等,你可以使用[ ... ][[ ... ]] ,但是你必须引用你的参数。 如果要执行glob模式匹配,则必须忽略引号,并使用[[ ... ]]

要比较变量xy两个字符串是否相等,请使用

 if test "$x" = "$y"; then printf '%s\n' "equal" else printf '%s\n' "not equal" fi 

要测试x是否出现在y某处,请使用

 case $y in (*"$x"*) printf '%s\n' "$y contains $x" ;; (*) printf '%s\n' "$y does not contain $x" ;; esac 

请注意,这些结构可以移植到任何POSIX shell,而不仅仅是bash。 测试的[[ ]]构造不是标准的外壳特征。

我不知道你在哪里提出这个* ,但你真的很接近:

 s="STP=20" if [[ "STP=20" == "$s" ]]; then echo "It worked!" fi 

你需要在字符串s="STP=20"使用\ escape =

 s="STP\=20" if [[ "STP\=20" == "$s" ]]; then echo Hi; else echo Bye; fi