代码之家  ›  专栏  ›  技术社区  ›  Tyler

为什么通配符模式与转义后拉不匹配

  •  0
  • Tyler  · 技术社区  · 6 年前

    我有下面的bash脚本,我在其中测试一些通配符模式匹配,并期望所有调用 test 回音 match . 我不明白为什么最后一个案子不符合:

    #!/bin/bash
    
    test () {
      subject=$1
      pattern=$2
      echo "----------------"
      echo "$subject vs $pattern"
      case $subject in
        ($pattern) echo "match";;
        (*)        echo "no match";;
      esac
    }
    
    # Test question mark
    test "a" "?"
    
    # Test asterisk
    test "foobar" "*"
    
    # Test literal
    test "a" "a"
    
    # Test backslash
    test "\\" "\\"
    

    输出:

    $ ./example.sh
    ----------------
    a vs ?
    match
    ----------------
    foobar vs *
    match
    ----------------
    a vs a
    match
    ----------------
    \ vs \
    no match
    

    我知道反斜杠是用来转义的,但我不明白为什么主题和模式在相同的情况下不匹配 "\\" -难道他们不应该以同样的方式逃走吗?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Jerry Jeremiah    6 年前

    test "\\" "\\" 函数在$1和$2中收到的是一个包含单个反斜杠的字符串。

    如果你这样做了 if [ $subject = $pattern ]; then ... 它工作是因为没有模式匹配。

    但是模式匹配意味着模式字符串中的单个反斜杠必须转义某些内容—单个反斜杠本身无效。这就是为什么你的陈述不起作用。

    如果模式是包含两个反斜杠的字符串,那么第一个将转义第二个,它将匹配包含一个反斜杠的主题字符串。

    上一次测试中的case语句相当于:

    case "\\" in (\) echo "match"; esac
    

    它不能工作,因为模式中的反斜杠必须转义。

    但这是可行的:

    case "\\" in (\\) echo "match"; esac
    

    所以一个有效的测试是:

    test "\\" "\\\\"