【问题标题】:Why does wildcard pattern not match for escaped backslach为什么通配符模式与转义的反斜杠不匹配
【发布时间】:2019-12-18 20:06:46
【问题描述】:

我有以下 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

我知道反斜杠是用来转义的,但是我不明白为什么主题和模式相同时不匹配"\\" - 不应该以相同的方式转义吗?

【问题讨论】:

  • 顺便说一句,作为一般评论,使用test 作为您的函数的名称是一个糟糕的选择。 test 是内置的 unix 实用程序(是在您执行 [ expression ] 时使用的实用程序,但您也可以使用它的名称)。
  • 谢谢,以后我会注意的。
  • 当我接触 linux 时,你不知道我花了多长时间才意识到我的 test 程序给出了奇怪的错误:我正在执行 test 而不是 ./test

标签: bash wildcard glob


【解决方案1】:

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

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

但是模式匹配意味着 PATTERN 字符串中的单个反斜杠必须转义一些东西 - 单个反斜杠本身是无效的。这就是您的案例陈述不起作用的原因。

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

你在最后一个测试中的case语句相当于:

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

这行不通,因为模式中的反斜杠必须转义。

但这会起作用:

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

所以一个有效的测试是:

test "\\" "\\\\"

【讨论】:

  • 谢谢,关于单个反斜杠无效的部分是我缺少的部分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多