如何比较Bash中的“if”语句中的两个stringvariables?

我试图让一个if语句在Bash中工作(使用Ubuntu ):

 #!/bin/bash s1="hi" s2="hi" if ["$s1" == "$s2"] then echo match fi 

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

[嗨:命令未find

我看了各种网站和教程,并复制这些,但它不工作 – 我做错了什么?

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

我只是工作了空间位..:/我怎么说包含?

我试过了

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

但它没有工作。

对于string比较,请使用:

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

对于包含b ,使用:

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

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

坏:

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

好:

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

你需要空间:

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

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

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

^ s显示您需要离开的空白处。

我build议这个:

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

注意打开/closures括号和variables之间的空白,以及包含'='符号的空白。

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

 #!/bin/bash 

要么

 #!/bin/sh 

这是来源 。

我会build议:

 #!/bin/bash s1="hi" s2="hi" if [ $s1 = $s2 ] then echo match fi 

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

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

我现在还没有访问linux的盒子,但[其实是一个程序(和bash内置),所以我认为你必须在[和第一个参数之间加一个空格。

还要注意,string相等运算符似乎是单个=

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

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

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

如果你正在使用sh,那么使用#!/bin/sh并将你的脚本保存为filename.sh 。 要执行使用sh filename.sh – 那么你必须使用single = 。 避免混杂在一起。

 #!/bin/bash s1="hi" s2="hi" if [ "x$s1" == "x$s2" ] then echo match fi 

在里面添加额外的string使得它更安全。

您也可以使用其他符号来表示单行命令:

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

对于纯粹的Bash和没有test的版本,但真的很难看,试试:

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

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

这比回答更澄清! 是的,线索出现在错误信息中:

[嗨:命令未find

它显示你的“你好”已经连接到“[”。

与传统的编程语言不同的是,在Bash中,“[”是一个类似于更为明显的“ls”等的命令 – 它不是专门处理,因为它是一个符号,因此“[”和“(替代)”$ s1 “在你的问题中,它们紧挨着,然后join(这对于Bash来说是正确的),然后试图在这个位置find一个命令:[嗨 – 这是Bash所不知道的。

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

因此你需要打开“[”之后的空格。