bash case 语句引用的行为与记录的一样,但请解释
bash case statement quoting behaves as documented, but please explain
c.f。 case
example here
具体来说:
$: g=a*[b]; case $g in $g) echo 'unquoted pattern' ;; "$g") echo 'quoted pattern' ;; esac
quoted pattern
一个简单的字符串的行为完全符合预期 -
$: g=a; case $g in $g) echo 'unquoted pattern' ;; "$g") echo 'quoted pattern' ;; esac
unquoted pattern
我确保没有与 glob 匹配的文件,没有 shopt
选项搅浑水,并明确测试了该值:
$: echo @$g@ "@$g@" $g "$g"
@a*[b]@ @a*[b]@ a*[b] a*[b]
$: [[ $g == "$g" ]] && echo ok || echo no
ok
那么为什么呢,在这种情况下,选择第二个选项?
两者不应该评估相同的结果吗?
case
语句使用模式匹配而不是字符串相等性来将单词与每个模式进行比较。
模式 a*[b]
匹配任何以 a
开头的字符串,零个或多个字符后跟一个 b
。它不匹配 字符串 a*[b]
,因为该字符串以 ]
结尾,而不是 b
.
c.f。 case
example here
具体来说:
$: g=a*[b]; case $g in $g) echo 'unquoted pattern' ;; "$g") echo 'quoted pattern' ;; esac
quoted pattern
一个简单的字符串的行为完全符合预期 -
$: g=a; case $g in $g) echo 'unquoted pattern' ;; "$g") echo 'quoted pattern' ;; esac
unquoted pattern
我确保没有与 glob 匹配的文件,没有 shopt
选项搅浑水,并明确测试了该值:
$: echo @$g@ "@$g@" $g "$g"
@a*[b]@ @a*[b]@ a*[b] a*[b]
$: [[ $g == "$g" ]] && echo ok || echo no
ok
那么为什么呢,在这种情况下,选择第二个选项?
两者不应该评估相同的结果吗?
case
语句使用模式匹配而不是字符串相等性来将单词与每个模式进行比较。
模式 a*[b]
匹配任何以 a
开头的字符串,零个或多个字符后跟一个 b
。它不匹配 字符串 a*[b]
,因为该字符串以 ]
结尾,而不是 b
.