Bash 为什么通配符模式与转义退格不匹配

Bash 为什么通配符模式与转义退格不匹配,bash,wildcard,glob,Bash,Wildcard,Glob,在下面的bash脚本中,我正在测试一些通配符模式匹配,并希望所有对test的调用都能返回match。我不明白为什么最后一个案例不匹配: #!/bin/bash test () { subject=$1 pattern=$2 echo "----------------" echo "$subject vs $pattern" case $subject in ($pattern) echo "match";; (*) echo "no matc

在下面的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和$2中接收到的是一个包含单个反斜杠的字符串

如果你做了
If[$subject=$pattern];然后…
因为没有模式匹配,所以它可以工作

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

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

您在上一次测试中的案例陈述相当于:

case "\\" in (\) echo "match"; esac
这是行不通的,因为模式中的反斜杠一定是漏掉了什么

但这是可行的:

case "\\" in (\\) echo "match"; esac
因此,有效的测试是:

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

如果你做了
If[$subject=$pattern];然后…
因为没有模式匹配,所以它可以工作

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

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

您在上一次测试中的案例陈述相当于:

case "\\" in (\) echo "match"; esac
这是行不通的,因为模式中的反斜杠一定是漏掉了什么

但这是可行的:

case "\\" in (\\) echo "match"; esac
因此,有效的测试是:

test "\\" "\\\\"

顺便说一句,一般来说,使用
test
作为函数名是一个糟糕的选择
test
是内置的unix实用程序(在执行
[expression]
操作时使用,但您也可以使用它的名称)。谢谢,以后我会注意到这一点。当我接触linux时,你不知道我花了多长时间才意识到我的
test
程序出现了奇怪的错误:我执行的是
test
,而不是
/test
。顺便说一下,作为一般评论,你可能还想看看,使用
test
作为你函数的名称是一个糟糕的选择
test
是内置的unix实用程序(在执行
[expression]
操作时使用,但您也可以使用它的名称)。谢谢,以后我会注意到这一点。当我接触linux时,你不知道我花了多长时间才意识到我的
test
程序出现了奇怪的错误:我执行的是
test
,而不是
/test
。你可能还想看一看谢谢,关于单个反斜杠无效的部分是我丢失的部分。谢谢,关于单反斜杠无效的一点是我遗漏的那一块。