如何比较';如果';Bash中的语句?

如何比较';如果';Bash中的语句?,bash,if-statement,scripting,Bash,If Statement,Scripting,我正在尝试获取一个if语句来使用(使用): 我尝试了各种形式的if语句,使用[[“$s1”==“$s2”]],带引号和不带引号,使用=,=和-eq,但我仍然得到以下错误: [嗨:找不到命令] 我看过各种网站和教程,并复制了它们,但都不起作用——我做错了什么 最后,我想说如果$s1包含$s2,那么我该怎么做呢 我刚刚算出了空格位…:/contains怎么说 我试过了 if [[ "$s1" == "*$s2*" ]] 但它不起作用。您需要空间: if [ "$s1" == "$s2" ] 我建

我正在尝试获取一个
if
语句来使用(使用):

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

[嗨:找不到命令]

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

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

我刚刚算出了空格位…:/contains怎么说

我试过了

if [[ "$s1" == "*$s2*" ]]
但它不起作用。

您需要空间:

if [ "$s1" == "$s2" ]
我建议:

#!/bin/bash

s1="hi"
s2="hi"

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

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

我现在没有访问Linux box的权限,但是
[
实际上是一个程序(和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" ]]
if [[ "$s1" == "$s2" ]]
对于字符串不等于比较,请使用:

if [[ "$s1" == "$s2" ]]
if [[ "$s1" != "$s2" ]]
if [[ "$s1" == "$s2" ]]
对于
a
包含
b
,请使用:

if [[ $s1 == *"$s2"* ]]
(并确保在符号之间添加空格):

坏的:

好:


在变量包含以下内容时,应小心在“[”符号和双引号之间留出空格:

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

>代码> ^ S显示您需要离开的空白空间。

< P>一个纯BASH和没有<代码>测试< /代码>的版本,但确实很难看,尝试:

if ( exit "${s1/*$s2*/0}" )2>/dev/null
then
   echo match
fi
说明:在
()
中打开了一个额外的子shell。如果有匹配项,它将以0退出,如果没有匹配项,它将尝试以$s1退出,这会引发错误(丑陋)。此错误指向
/dev/null

我建议这样做:

if [ "$a" = "$b" ]
请注意打开/关闭括号与变量之间的空格,以及环绕“=”符号的空格

另外,要小心你的脚本头。不管你使用什么,都不一样

#!/bin/bash


.

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

[嗨:找不到命令]

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

与更传统的编程语言不同,在Bash中,“[”是一个命令,就像更明显的“ls”一样,等等。因为它是一个符号,所以没有对它进行特殊处理,因此在您的问题中,“[”和(替换的)“$s1”是连接在一起的(对于Bash来说是正确的),然后它尝试在该位置查找命令:[hi-Bash不知道该位置

在C和其他一些语言中,“[”将被视为一个不同的“字符类”,并与下面的“hi”不相交


因此,在开头“[”

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

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


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

Bash 4+示例。注意:如果单词包含空格等,则不使用引号会导致问题。请始终在B中引用阿什·伊莫

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

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

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

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

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

示例5,精确匹配(区分大小写):

示例6,精确匹配(不区分大小写):

例7,精确匹配:

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

是的,没错,我错过了空格。带“[$s1=$s2]”它是有效的。为什么要省略双引号呢?它们是可选的,但在这种有限的特定情况下是无害的,但是在许多实际情况下删除它们会是一个严重的错误。请参见尝试使用
s1='*'
s2='*'
,您会发现省略双引号是一个严重的错误。只是想说确保不要这样做o在开始方括号和结束方括号与
“$s1”==“$s2”
语句之间留一个空格,否则它将不起作用。此外,如果测试“$s1”=“$s2”,这也起作用:
这都是关于空间:)@racl101的第一条评论为我解决了这个问题。谢谢!!
=
对ash、dash或其他地方不起作用。请改用
=
。这意味着“更安全”吗?为了完整性和清晰性,解释任何此类限定条件都很重要。事实上,这并不安全,现在我知道如果不引用它会更安全,这样可以防止语法错误,如果其中一个为空,我必须使用此答案将变量与固定字符串进行比较。IRC上挑剔的家伙告诉我,你应该使用if[“$s1”==“$s2”]]或case。双等号在第一种情况下是错误的。Bash可以容忍它,但可移植变量是
if[“$s1”=“$s2”]
。另请参见Hi,我想知道这为什么不好->if[“$s1”=“$s2”]空格有什么意义?@sangime,
[
是一个命令(实际上,是名为
test
)的命令的另一个名称;如果运行
which[
,您将看到实际上有一个
if [ "$s1" == "$s2" ]
if [[ "${str,,}" == *"yes"* ]] ;then
if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
 if [[ "${str}" == *"yes"* ]] ;then
 if [[ "${str}" =~ "yes" ]] ;then
 if [[ "${str}" == "yes" ]] ;then
 if [[ "${str,,}" == "yes" ]] ;then
 if [ "$a" = "$b" ] ;then