首页 文章

如何比较Bash中'if'语句中的两个字符串变量? [重复]

提问于
浏览
485

这个问题在这里已有答案:

我正试图在Bash中使用 if 语句(使用Ubuntu):

#!/bin/bash

s1="hi"
s2="hi"

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

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

[hi:命令未找到

我查看了各种网站和教程并复制了这些内容和教程,但它不起作用 - 我做错了什么?

最后,我想说 $s1 是否包含 $s2 ,那我怎么能这样做呢?

我刚刚解决了空位...:/我怎么说包含?

我试过了

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

但它不起作用 .

12 回答

  • 657

    我建议这个:

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

    注意打开/关闭括号和变量之间的空白区域以及包裹“=”符号的空格 .

    另外,请注意脚本 Headers . 你是否使用它并不是一回事

    #!/bin/bash
    

    要么

    #!/bin/sh
    

    Here's the source .

  • 122

    我会建议:

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

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

  • 8

    对于纯Bash且没有 test 的版本,但真的很难看,请尝试:

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

    说明:在 ( ) 中打开了一个额外的子shell . 如果有匹配则退出0,如果没有匹配引发错误(丑陋),它会尝试退出$ s1 . 此错误指向 /dev/null .

  • 5

    你应该小心在'['和双引号的符号之间留一个空格,变量包含这个:

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

    ^ 显示您需要离开的空格 .

  • 7

    Bash4的例子 . 注意:当单词包含空格等时,不使用引号会导致问题 . 总是引用bash IMO .

    以下是BASH4的一些示例:

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

    if [[ "${str,,}" == *"yes"* ]] ;then
    

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

    if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then
    

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

    if [[ "${str}" == *"yes"* ]] ;then
    

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

    if [[ "${str}" =~ "yes" ]] ;then
    

    例5,完全匹配(区分大小写):

    if [[ "${str}" == "yes" ]] ;then
    

    例6,完全匹配(不区分大小写):

    if [[ "${str,,}" == "yes" ]] ;then
    

    例7,完全匹配:

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

    我现在无法访问linux盒子,但是[实际上是一个程序(和内置的bash),所以我认为你必须在[和第一个参数之间]放置一个空格 .

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

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

    在里面添加额外的字符串使它更安全 .

    您还可以对单行命令使用其他表示法:

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

    对于字符串比较,请使用:

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

    对于包含 ba ,请使用:

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

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

    坏:

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

    好:

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

    这比答案更清晰!是的,线索在错误消息中:

    [hi:命令未找到

    它向您显示您的“hi”已连接到“[” .

    与更传统的编程语言不同,在Bash中,“[”是一个命令就像更明显的“ls”等 - 它没有被特别对待,因为它是一个符号,因此“[”和(替换)“$ s1 “在你的问题中紧挨着彼此,加入(对于Bash来说是正确的)然后它试图在那个位置找到一个命令:[hi - Bash不知道 .

    在C和其他一些语言中,“[”将被视为一个不同的“字符类”,并且将与以下“hi”脱节 .

    因此,在打开“[”后需要一个空格 .

  • 9

    这个问题已经有了很好的答案,但在这里看来,使用单个等号和双等号之间存在轻微的混淆

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

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

    如果您使用 sh ,则使用 #!/bin/sh 并将脚本另存为 filename.sh . 要执行使用 sh filename.sh - 那么你必须使用单个 = . 避免混合它们 .

  • 30

    你需要空格:

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

相关问题