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

How do I compare two string variables in an 'if' statement in Bash?

本问题已经有最佳答案,请猛点这里访问。

我正在尝试在bash中使用if语句(使用ubuntu):

1
2
3
4
5
6
7
8
9
#!/bin/bash

s1="hi"
s2="hi"

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

我试过各种形式的if声明,使用[["$s1" =="$s2"]],加引号和不加引号,使用===-eq,但我仍然得到以下错误:

[hi: command not found

我浏览过各种网站和教程,并复制了它们,但它不起作用——我做错了什么?

最后,我想说如果$s1包含$s2,我该怎么做?

我只是计算了一下空间。:/我怎么说包含?

我试过

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

但它不起作用。


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

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

对于含有ba而言,使用:

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

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

坏的:

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

好:

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


您需要共享空间:

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


在变量包含此内容的"["符号和双引号之间应注意留有空格:

1
2
3
4
if ["$s1" =="$s2" ]; then
#   ^     ^  ^     ^
   echo match
fi

EDCOX1×2表示需要离开的空白空间。


我建议这个:

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

注意开/闭括号和变量之间的空白,以及环绕"="符号的空白。

另外,注意脚本头。不管你用什么都不一样

1
#!/bin/bash

1
#!/bin/sh

这是来源。


我建议:

1
2
3
4
5
6
7
8
9
#!/bin/bash

s1="hi"
s2="hi"

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

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


bash4+示例。注意:不使用引号会导致单词包含空格等问题。总是引用bash imo的话。

下面是一些示例bash4+:

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

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

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

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

示例3,检查字符串中的"是"(区分大小写):

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

示例4,检查字符串中的"是"(区分大小写):

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

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

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

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

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

例7,完全匹配:

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


这个问题已经有了很好的答案,但是在这里,在

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

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

如果使用sh,则使用#!/bin/sh,并将脚本保存为filename.sh。要执行使用sh filename.sh,则必须使用单个=。避免把它们混在一起。


1
2
3
4
5
$ if ["$s1" =="$s2" ]; then echo match; fi
match
$ test"s1" ="s2" ;echo match
match
$


我现在没有访问Linux设备的权限,但[实际上是一个程序(和bash内置),所以我认为您必须在[和第一个参数之间放置一个空格。

还要注意,字符串相等运算符似乎是一个=


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

[hi: command not found

这表明您的"hi"已连接到"["。

与更传统的编程语言不同,在bash中,"["是一个命令,就像更明显的"ls"等一样。—它不被特别对待,仅仅是因为它是一个符号,因此"["和(替换的)"$s1"在您的问题中紧挨在一起,被连接(对于bash是正确的),然后它试图在tha中找到一个命令。T位置:【嗨—巴什不知道。

在C语言和其他一些语言中,"["将被视为一个不同的"字符类",并与下面的"hi"分离。

因此,在开口"["后需要一个空格。


对于纯bash和不带test但非常难看的版本,请尝试:

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

说明:在( )中,一个额外的子壳被打开。如果匹配,则退出0;如果不匹配,则尝试退出$s1,这会导致错误(丑陋)。此错误指向/dev/null


1
2
3
4
5
6
7
8
9
#!/bin/bash

s1="hi"
s2="hi"

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

在内部添加额外的字符串使其更安全。

您还可以对单行命令使用其他符号:

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