提问人:Mr Shoubs 提问时间:11/25/2010 最后编辑:Peter MortensenMr Shoubs 更新时间:2/15/2021 访问量:1438840
如何在 Bash 的“if”语句中比较两个字符串变量?[复制]
How do I compare two string variables in an 'if' statement in Bash? [duplicate]
问:
我正在尝试让一个语句在 Bash 中工作(使用 Ubuntu):if
#!/bin/bash
s1="hi"
s2="hi"
if ["$s1" == "$s2"]
then
echo match
fi
我尝试了各种形式的语句,使用带引号和不带引号,使用 和 ,但我仍然收到以下错误:if
[["$s1" == "$s2"]]
=
==
-eq
[hi:找不到命令
我查看了各种网站和教程并复制了它们,但它不起作用 - 我做错了什么?
最后,我想说如果包含,那我该怎么做呢?$s1
$s2
我只是解决了空间问题...... :/我怎么说包含?
我试过了
if [[ "$s1" == "*$s2*" ]]
但它没有用。
答:
您需要空格:
if [ "$s1" == "$s2" ]
评论
"$s1" == "$s2"
if test "$s1" = "$s2"
==
不适用于 ash、dash 或其他地方的基线 POSIX 实现。请改用。test
=
我建议:
#!/bin/bash
s1="hi"
s2="hi"
if [ $s1 = $s2 ]
then
echo match
fi
不带双引号,只有一个等于。
评论
s1='*'
s2='*'
我现在无法访问 Linux 盒子,但实际上是一个程序(和一个内置的 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" ]]
对于 包含 ,请使用:a
b
if [[ $s1 == *"$s2"* ]]
(并确保在符号之间添加空格):
坏:
if [["$s1" == "$s2"]]
好:
if [[ "$s1" == "$s2" ]]
评论
[
test
which [
ls
[
[
test
]
$ if [ "$s1" == "$s2" ]; then echo match; fi
match
$ test "s1" = "s2" ;echo match
match
$
评论
[[
您应该注意在“[”符号和双引号之间留一个空格,其中变量包含以下内容:
if [ "$s1" == "$s2" ]; then
# ^ ^ ^ ^
echo match
fi
s 显示您需要留下的空格。^
评论
; then
fi
==
不适用于 ash、dash 或其他地方的基线 POSIX 实现。请改用。test
=
对于具有纯 Bash 且没有 但非常丑陋的版本,请尝试:test
if ( exit "${s1/*$s2*/0}" )2>/dev/null
then
echo match
fi
说明:在打开一个额外的子 shell。如果有匹配项,则以 0 退出,如果没有引起错误(丑陋)的匹配项,则尝试以 $s 1 退出。此错误被定向到 。( )
/dev/null
评论
command
s2
$s2
"${s1/*"$s2"*/0}"
s1
0
s1=000000; s2=some_other_stuff
s1=--; s2=stuff
s1=--help; s2=stuff
我建议这个:
if [ "$a" = "$b" ]
注意左/右括号和变量之间的空格,以及包裹“=”号的空格。
另外,请注意脚本标头。是否使用不是一回事
#!/bin/bash
或
#!/bin/sh
这是来源。
评论
这与其说是答案,不如说是澄清!是的,线索在错误消息中:
[hi:找不到命令
这表明您的“hi”已连接到“[”。
与更传统的编程语言不同,在 Bash 中,“[”是一个命令,就像更明显的“ls”等一样 - 它不会仅仅因为它是一个符号而被特别对待,因此“[”和(替换的)“$s 1”在你的问题中紧挨着,被连接起来(对于 Bash 来说是正确的),然后它试图在该位置找到一个命令: [hi - Bash 不知道。
在 C 语言和其他一些语言中,“[”将被视为不同的“字符类”,并且与后面的“hi”不相交。
因此,您需要在开头“[”之后有一个空格。
这个问题已经有很好的答案,但在这里似乎在使用单相等 () 和双等于 () 之间存在轻微的混淆=
==
if [ "$s1" == "$s2" ]
主要区别在于您使用的脚本语言。如果您使用的是 Bash,请包含在脚本的开头并将脚本另存为 .要执行,请使用 - 然后您必须使用 .#!/bin/bash
filename.bash
bash filename.bash
==
如果您使用的是 sh,则使用您的脚本并将其另存为 .要执行使用,则必须使用单个 .避免将它们混合在一起。#!/bin/sh
filename.sh
sh filename.sh
=
评论
==
=
==
#!/bin/bash
./filename.bash
#!/bin/sh
#!/bin/bash
./filename
Bash 4+ 示例。注意:当单词包含空格等时,不使用引号会导致问题。始终在 Bash IMO 中引用。
以下是 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
评论