这个问题在这里已有答案:
#!/bin/bash
s1="hi"
s2="hi"
if ["$s1" == "$s2"]
then
echo match
fi
我已经尝试了各种形式的 if
语句,使用 [["$s1" == "$s2"]]
,有和没有引号,使用 =
, ==
和 -eq
,但我仍然收到以下错误:
[hi:命令未找到
我查看了各种网站和教程并复制了这些内容和教程,但它不起作用 - 我做错了什么?
最后,我想说 $s1
是否包含 $s2
,那我怎么能这样做呢?
我刚刚解决了空位...:/我怎么说包含?
我试过了
if [[ "$s1" == "*$s2*" ]]
但它不起作用 .
12 回答
我建议这个:
注意打开/关闭括号和变量之间的空白区域以及包裹“=”符号的空格 .
另外,请注意脚本 Headers . 你是否使用它并不是一回事
要么
Here's the source .
我会建议:
没有双引号,只有一个等于 .
对于纯Bash且没有
test
的版本,但真的很难看,请尝试:说明:在
( )
中打开了一个额外的子shell . 如果有匹配则退出0,如果没有匹配引发错误(丑陋),它会尝试退出$ s1 . 此错误指向/dev/null
.你应该小心在'['和双引号的符号之间留一个空格,变量包含这个:
^
显示您需要离开的空格 .Bash4的例子 . 注意:当单词包含空格等时,不使用引号会导致问题 . 总是引用bash IMO .
以下是BASH4的一些示例:
例1,检查字符串中的“是”(不区分大小写):
例2,检查字符串中的“是”(不区分大小写):
例3,检查字符串中的“是”(区分大小写):
例4,检查字符串中的“是”(区分大小写):
例5,完全匹配(区分大小写):
例6,完全匹配(不区分大小写):
例7,完全匹配:
我现在无法访问linux盒子,但是[实际上是一个程序(和内置的bash),所以我认为你必须在[和第一个参数之间]放置一个空格 .
还要注意,字符串相等运算符似乎是单个=
在里面添加额外的字符串使它更安全 .
您还可以对单行命令使用其他表示法:
对于字符串比较,请使用:
对于包含
b
的a
,请使用:(并确保在符号之间添加空格):
坏:
好:
这比答案更清晰!是的,线索在错误消息中:
它向您显示您的“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
- 那么你必须使用单个=
. 避免混合它们 .你需要空格: