如何比较Bash中'if'语句中的两个字符串变量?

时间:2010-11-25 13:39:34

标签: bash if-statement scripting

我正在尝试在Bash中使用if语句(使用Ubuntu):

#!/bin/bash

s1="hi"
s2="hi"

if ["$s1" == "$s2"]
then
  echo match
fi

我使用if,使用[["$s1" == "$s2"]],使用===-eq,使用$s1$s2if [[ "$s1" == "*$s2*" ]] 尝试使用{{1}}语句的各种形式我仍然收到以下错误:

  

[hi:命令未找到

我查看了各种网站和教程并复制了这些内容和教程,但它不起作用 - 我做错了什么?

最后,我想说{{1}}是否包含{{1}},我该怎么办呢?

我做了空位...:/我怎么说包含?

我试过

{{1}}

但它不起作用。

12 个答案:

答案 0 :(得分:746)

对于字符串比较,请使用:

if [ "$s1" == "$s2" ]

对于a包含b,请使用:

if [[ $s1 == *"$s2"* ]]

(并确保在符号之间添加空格):

坏:

if ["$s1" == "$s2"]

好:

if [ "$s1" == "$s2" ]

答案 1 :(得分:149)

你需要空格:

if [ "$s1" == "$s2" ]

答案 2 :(得分:130)

你应该小心在'['和双引号的符号之间留一个空格,其中变量包含这个:

if [ "$s1" == "$s2" ]; then
#   ^     ^  ^     ^
   echo match
fi

^显示您需要离开的空格。

答案 3 :(得分:31)

我建议这个:

if [ "$a" = "$b" ]

注意打开/关闭括号和变量之间的空白区域以及包裹' ='的空白区域。登录。

另外,请注意脚本标题。你是否使用

并不是一回事
#!/bin/bash

#!/bin/sh

Here's the source

答案 4 :(得分:15)

我建议:

#!/bin/bash

s1="hi"
s2="hi"

if [ $s1 = $s2 ]
then
  echo match
fi

没有双引号且只有一个等于。

答案 5 :(得分:14)

Bash4 +示例。注意:当单词包含空格等时,不使用引号会导致问题。总是引用bash IMO。

以下是BASH4 +的一些例子:

示例1,在字符串中检查“是”(不区分大小写):

if [[ "${str,,}" == *"yes"* ]] ;then

示例2,在字符串中检查“是”(不区分大小写):

if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then

示例3,在字符串中检查“是”(区分大小写):

 if [[ "${str}" == *"yes"* ]] ;then

示例4,在字符串中检查“是”(区分大小写):

 if [[ "${str}" =~ "yes" ]] ;then

示例5,完全匹配(区分大小写):

 if [[ "${str}" == "yes" ]] ;then

示例6,完全匹配(不区分大小写):

 if [[ "${str,,}" == "yes" ]] ;then

示例7,完全匹配:

 if [ "$a" = "$b" ] ;then

答案 6 :(得分:12)

这个问题已经有了很好的答案,但在这里似乎在使用单个等号和双等号之间存在轻微的混淆

if [ "$s1" == "$s2" ]

主要区别在于您使用的是哪种脚本语言。如果您使用 bash ,请在脚本开头添加#!/bin/bash,并将脚本另存为filename.bash。要执行使用bash filename.bash - 那么您必须使用==

如果您使用 sh ,请使用#!/bin/sh并将脚本另存为filename.sh。要执行使用sh filename.sh - 那么您必须使用单=。避免混合它们。

答案 7 :(得分:8)

$ if [ "$s1" == "$s2" ]; then echo match; fi
match
$ test "s1" = "s2" ;echo match
match
$

答案 8 :(得分:6)

我现在无法访问linux盒子,但是[实际上是一个程序(和内置的bash),所以我认为你必须在[和第一个参数之间]留一个空格。

另请注意,字符串相等运算符似乎是单个=

答案 9 :(得分:5)

这比答案更清晰! 是的,线索在错误消息中:

  

[hi:命令未找到

向您显示您的" hi"已被连接到" ["。

与更传统的编程语言不同,在Bash中," ["是一个命令就像更明显的命令" ls"它没有被特别对待,因为它是一个符号,因此" ["和(替代)" $ s1"在你的问题中紧挨着彼此,加入(对Bash来说是正确的)然后它尝试在那个位置找到一个命令:[hi - Bash不知道。

在C和其他一些语言中," ["将被视为一个不同的角色类"并将脱离以下"嗨"。

因此在开幕后你需要一个空格" ["。

答案 10 :(得分:2)

#!/bin/bash

s1="hi"
s2="hi"

if [ "x$s1" == "x$s2" ]
then
  echo match
fi

在里面添加额外的字符串使它更安全。

您还可以对单行命令使用其他表示法:

[ "x$s1" == "x$s2" ] && echo match

答案 11 :(得分:2)

对于纯Bash而没有test的版本,但真的很难看,请尝试:

if ( exit "${s1/*$s2*/0}" )2>/dev/null
then
   echo match
fi

说明:在( )中打开一个额外的子shell。如果有匹配则退出0,如果没有匹配引发错误(丑陋),它会尝试退出$ s1。此错误定向到/dev/null