我试图得到一个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*" ]]

但这并没有起作用。


当前回答

Bash 4+示例。注意:当单词中包含空格时,不使用引号会导致问题。在我看来,总是引用Bash。

下面是一些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

其他回答

你需要空格:

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

我建议:

#!/bin/bash

s1="hi"
s2="hi"

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

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

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

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

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

如果你使用sh,那么使用#!/bin/sh并保存为filename.sh。要执行sh filename.sh -则必须使用single =。避免把它们混在一起。

你应该注意在符号'['和双引号之间留下一个空格,其中变量包含:

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

^表示你需要留下的空白。

对于一个纯Bash版本,没有测试,但真的很难看,尝试:

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

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