如何比较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”不相交。
因此你需要打开“[”之后的空格。