为什么通配符模式与转义的反斜杠不匹配
Why does wildcard pattern not match for escaped backslach
我有以下 bash 脚本,我正在其中测试一些通配符模式匹配并期望对 test
的所有调用都回显 match
。我不明白为什么最后一个案例不匹配:
#!/bin/bash
test () {
subject=
pattern=
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 "\" "\"
函数在 $1 和 $2 中接收到的是一个包含单个反斜杠的字符串。
如果你这样做 if [ $subject = $pattern ]; then ...
它会起作用,因为没有模式匹配。
但是模式匹配意味着 PATTERN 字符串中的单个反斜杠必须对某些内容进行转义 - 单个反斜杠本身是无效的。这就是为什么你的案例陈述不起作用。
如果 PATTERN 是一个包含两个反斜杠的字符串,那么第一个将转义第二个,它会匹配包含一个反斜杠的 SUBJECT 字符串。
你在上次测试中的 case 语句等同于:
case "\" in (\) echo "match"; esac
这是行不通的,因为模式中的反斜杠必须转义。
但这行得通:
case "\" in (\) echo "match"; esac
所以一个有效的测试是:
test "\" "\\"
我有以下 bash 脚本,我正在其中测试一些通配符模式匹配并期望对 test
的所有调用都回显 match
。我不明白为什么最后一个案例不匹配:
#!/bin/bash
test () {
subject=
pattern=
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 "\" "\"
函数在 $1 和 $2 中接收到的是一个包含单个反斜杠的字符串。
如果你这样做 if [ $subject = $pattern ]; then ...
它会起作用,因为没有模式匹配。
但是模式匹配意味着 PATTERN 字符串中的单个反斜杠必须对某些内容进行转义 - 单个反斜杠本身是无效的。这就是为什么你的案例陈述不起作用。
如果 PATTERN 是一个包含两个反斜杠的字符串,那么第一个将转义第二个,它会匹配包含一个反斜杠的 SUBJECT 字符串。
你在上次测试中的 case 语句等同于:
case "\" in (\) echo "match"; esac
这是行不通的,因为模式中的反斜杠必须转义。
但这行得通:
case "\" in (\) echo "match"; esac
所以一个有效的测试是:
test "\" "\\"