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

我正在尝试让if语句在Bash中工作(使用ubuntu):

#!/bin/bash


s1="hi"
s2="hi"


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

我尝试了if语句的各种形式,使用[["$s1" == "$s2"]],带引号和不带引号,使用===-eq,但我仍然得到以下错误:

[hi:找不到命令

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

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

我刚刚计算了空格位…:/我怎么说包含

我试过

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

但它没有奏效。

1341696 次浏览

你需要空间:

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

我建议:

#!/bin/bash


s1="hi"
s2="hi"


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

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

我现在无法访问Linux框,但是[实际上是一个程序(和一个Bash内置程序),所以我认为你必须在[和第一个参数之间放一个空格。

另请注意,字符串等号操作符似乎是单个=

用途:

#!/bin/bash


s1="hi"
s2="hi"


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

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

您还可以对单行命令使用另一种表示法:

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

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

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

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

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

对于a包含b,请使用:

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

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

不好:

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

好:

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

您应该小心在变量包含以下内容的“[”符号和双引号之间留一个空格:

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

#EYZ显示您需要留下的空格。

对于带有纯Bash且没有test但非常丑陋的版本,请尝试:

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

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

我建议这个:

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

注意打开/关闭括号和变量之间的空白,以及包装“=”符号的空白。

另外,要小心你的脚本头。你是否使用它是不一样的

#!/bin/bash

#!/bin/sh

这就是源头

这与其说是答案,不如说是澄清!是的,线索就在错误消息中:

[hi:找不到命令

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

与更传统的编程语言不同,在Bash中,“[”是一个命令,就像更明显的“ls”等-它不会被特别对待,因为它是一个符号,因此在你的问题中紧邻的“[”和(替换的)“$s1”被连接在一起(对于Bash来说是正确的),然后它试图在那个位置找到一个命令:[hi-这对Bash来说是未知的。

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

因此,在“[”之后需要一个空格。

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

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

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

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

Bash 4+示例。注意:当单词包含空格等时,不使用引号会导致问题。始终在Bash IMO中引用。

以下是Bash 4+的一些示例:

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

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

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

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

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

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

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

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

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

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

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

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

例7,完全匹配:

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