首页 文章

如何比较Bash中的字符串

提问于
浏览
720

如何将变量与字符串进行比较(如果匹配则执行某些操作)?

10 回答

  • 1

    我这样做的方式与bash,dash(sh)兼容:

    testOutput="my test"
    pattern="my"
    
    case $testOutput in (*"$pattern"*)
        echo "if there is a match"
        exit 1
        ;;
    (*)
       ! echo there is no coincidence!
    ;;esac
    
  • 54

    在if语句中使用变量

    if [ "$x" = "valid" ]; then
      echo "x has the value 'valid'"
    fi
    

    如果要在不匹配时执行某些操作,请将 = 替换为 != . 您可以在各自的文档中阅读有关string operationsarithmetic operations的更多信息 .

    为什么我们在$ x附近使用报价?

    你想要 $x 周围的引号,因为如果它是空的,你的bash脚本会遇到语法错误,如下所示:

    if [ = "valid" ]; then
    

    非标准使用==运算符

    请注意, bash 允许 == 用于与 [ 相等,但this is not standard .

    使用第一种情况,其中 $x 周围的引号是可选的:

    if [[ "$x" == "valid" ]]; then
    

    或使用第二种情况:

    if [ "$x" = "valid" ]; then
    
  • 19

    或者,如果您不需要else子句:

    [ "$x" == "valid" ] && echo "x has the value 'valid'"
    
  • 1049

    要使用通配符比较字符串

    if [[ "$stringA" == *$stringB* ]]; then
      # Do something here
    else
      # Do Something here
    fi
    
  • 4
    a="abc"
    b="def"
    
    # Equality Comparison
    if [ "$a" == "$b" ]; then
        echo "Strings match"
    else
        echo "Strings don't match"
    fi
    
    # Lexicographic (greater than, less than) comparison.
    if [ "$a" \< "$b" ]; then
        echo "$a is lexicographically smaller then $b"
    elif [ "$a" \> "$b" ]; then
        echo "$b is lexicographically smaller than $a"
    else
        echo "Strings are equal"
    fi
    

    Notes:

    • if[ 之间的空格和 ] 非常重要

    • >< 是重定向运算符,因此对于字符串分别使用 \>\< 进行转义 .

  • 11

    我不得不在一点上不同意其中一条评论:

    [ "$x" == "valid" ] && echo "valid" || echo "invalid"
    

    不,这不是一个疯狂的oneliner

    它只是看起来像一个,嗯,没有经验......

    它在某种程度上使用普通模式作为语言;

    在你学会了这门语言之后 .

    实际上,阅读很好

    它是一个简单的逻辑表达式,有一个特殊部分:逻辑运算符的惰性求值 .

    [ "$x" == "valid" ] && echo "valid" || echo "invalid"
    

    每个部分都是一个逻辑表达式;第一个可能是真的,也可能是假的,其他两个都是真的 .

    (
    [ "$x" == "valid" ] 
    &&
    echo "valid"
    )
    ||
    echo "invalid"
    

    现在,在评估时,检查第一个 . 如果为false,则与逻辑 and && 之后的第二个操作数无关 . 第一个不是真的,所以它不可能是第一个和第二个是真的,无论如何 .
    现在,在这种情况下,逻辑的第一面是 or || false,但如果另一方 - 第三方 - 是真的,则可能是真的 .

    所以第三部分将被评估 - 主要是将信息写成副作用 . (它的结果为 0 为true,我们这里不使用)

    其他情况类似,但更简单 - 而且 - 我保证!是 - 可以 - 易于阅读!
    (我没有,但我认为作为一名有着灰胡子的UNIX老手对此有很大的帮助 . )

  • 8

    你也可以使用用例/ esac

    case "$string" in
     "$pattern" ) echo "found";;
    esac
    
  • 113

    以下脚本逐行从名为“testonthis”的文件中读取,然后将每行与一个简单的字符串,一个带有特殊字符的字符串和一个正则表达式(如果它不匹配)进行比较,那么脚本将打印该行而不是 .

    bash中的空间非常重要 . 所以下面的工作

    [ "$LINE" != "table_name" ]
    

    但是以下不会:

    ["$LINE" != "table_name"]
    

    所以请按原样使用:

    cat testonthis | while read LINE
    do
    if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
    echo $LINE
    fi
    done
    
  • 25

    如果输入只有几个有效条目,我可能会使用regexp匹配 . 例如 . 只有“开始”和“停止”才是有效的动作 .

    if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
      echo "valid action"
    fi
    

    请注意,我使用双逗号's. Also note that this won'来处理过于老化的bash版本,从而小写变量 $ACTION .

  • 47

    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
    

    请享用 .

相关问题