Bash 为什么不是';nocasematch关闭时,case语句是否区分大小写?

Bash 为什么不是';nocasematch关闭时,case语句是否区分大小写?,bash,pattern-matching,Bash,Pattern Matching,鉴于以下情况: $ echo $BASH_VERSION 4.2.10(1)-release $ shopt | fgrep case nocaseglob off nocasematch off $ case A in [a-z]) echo TRUE;; esac TRUE 我认为大写字母A不应与[A-z]的小写字符类匹配,但它确实匹配。为什么这场比赛没有失败?你不能以这种方式可靠地使用短跑。如果我不使用破折号,它将按预期工作: $ bash --version GN

鉴于以下情况:

$ echo $BASH_VERSION
4.2.10(1)-release

$ shopt | fgrep case
nocaseglob      off
nocasematch     off

$ case A in [a-z]) echo TRUE;; esac
TRUE

我认为大写字母A不应与[A-z]的小写字符类匹配,但它确实匹配。为什么这场比赛没有失败?

你不能以这种方式可靠地使用短跑。如果我不使用破折号,它将按预期工作:

$ bash --version
GNU bash, version 4.2.10(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ shopt -s nocasematch
$ case A in [abc]) echo TRUE;; esac
TRUE
$ shopt -u nocasematch
$ case A in [abc]) echo TRUE;; esac
$ 
pax> case A in [ab]) echo TRUE;; esac
pax> _

这与您的区域设置有关。具体来说,排序序列是不区分大小写的序列

例如,将
LC_COLLATE
设置为
en_AU.utf8
(我的系统上的默认设置),可以看到它同时包含小写和大写:

pax> case A in [a-b]) echo TRUE;; esac
TRUE
pax> _
但是,如果去掉范围说明符,它将按预期工作:

$ bash --version
GNU bash, version 4.2.10(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ shopt -s nocasematch
$ case A in [abc]) echo TRUE;; esac
TRUE
$ shopt -u nocasematch
$ case A in [abc]) echo TRUE;; esac
$ 
pax> case A in [ab]) echo TRUE;; esac
pax> _
这是因为第一个意思是a和b之间的
(包括)
,对于排序序列,它包括
a
。对于后者,仅表示
a
b
,而不是受排序顺序影响的范围

如果将排序顺序设置为区分大小写的排序顺序,则其工作原理与预期相同:

pax> export LC_COLLATE="C"
pax> case A in [a-b]) echo TRUE;; esac
pax> 
如果您只想在不影响任何其他操作的情况下一次性执行此操作,可以在子shell中执行此操作:

( export LC_COLLATE="C" ; case A in [a-b]) echo TRUE;; esac )

nocaseglob
是不相关的:
如果设置了,bash在执行路径名扩展时会以不区分大小写的方式匹配文件名(请参见上面的路径名扩展)
,尽管这种行为仍然很奇怪。