考虑以下几点:当nocasematch关闭时,为什么case case不区分大小写?
$ 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-Z]的,但它确实。为什么不匹配失败?
考虑以下几点:当nocasematch关闭时,为什么case case不区分大小写?
$ 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-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
$
但与破折号,它打印TRUE不管nocasematch
的设置。
Bash在这里做模式匹配。检查出this section of the reference manual它说,使用连字符MIGHT将[a-z]
解释为[A-Za-z]
!它告诉你如何获得传统的解释(将LC_COLLATE或LC_ALL设置为C)。基本上你的默认语言环境是按字典顺序排序的。参考手册很好地解释了事情。
附录
好吧,我要给你一个成绩单。
$ shopt -u nocasematch
$ case A in [a-z]) echo TRUE;; esac
TRUE
$ shopt -s nocasematch
$ case A in [a-z]) echo TRUE;; esac
TRUE
$ LC_ALL=C
$ shopt -u nocasematch
$ case A in [a-z]) echo TRUE;; esac
$ shopt -s nocasematch
$ case A in [a-z]) echo TRUE;; esac
TRUE
它与您的区域设置有关。具体来说,整理顺序是不区分大小写的。
例如,LC_COLLATE
设置为en_AU.utf8
(在我的系统默认),你可以看到,它包括大写和小写在一起:
pax> case A in [a-b]) echo TRUE;; esac
TRUE
pax> _
但是,如果你摆脱范围指定的,它按预期工作:
pax> case A in [ab]) echo TRUE;; esac
pax> _
这是因为第一种方法between a and b inclusive
其中,对于排序序列,包括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执行路径扩展时在不区分大小写的方式相匹配的文件名(参照路径名扩展上文)',虽然行为仍奇。 – Daenyth