Bash 字符 class 参数扩展不一致行为
Bash character class parameter expansion inconsistent behavior
以下所有步骤似乎向我暗示了 bash 中的错误。
版本和平台信息
--> cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.5 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.5 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
--> bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 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.
问题详细步骤:
--> ls
--> touch a aa aaa b bb bbb
--> ls *[:alpha:]
a aa aaa
--> rm a aa aaa
--> ls *[:alpha:]
ls: cannot access *[:alpha:]: No such file or directory
为什么“*[:alpha:]”会列出 'a*' 个文件名而不是 'b*' 个文件名?
对于那些好奇的人,要获得正确的行为,必须使用 *([[:alpha:]])。但这并不能解释此处出现的不一致。
没有不一致。删除重复字符后,[:alpha:]
等同于 [:alph]
。
所以 ls *[:alpha:]
实际上等同于 ls *[:alph]
,并且只有 a
、aa
和 aaa
匹配,所以这就是你得到的输出。
删除这些文件后,
ls *[:alph]
将找不到匹配项,因此会收到错误消息。
如果要使用 [:alpha:]
字符 class,
你需要写成 [[:alpha:]]
.
以下所有步骤似乎向我暗示了 bash 中的错误。
版本和平台信息
--> cat /etc/os-release
NAME="Ubuntu"
VERSION="14.04.5 LTS, Trusty Tahr"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 14.04.5 LTS"
VERSION_ID="14.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
--> bash --version
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
Copyright (C) 2013 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.
问题详细步骤:
--> ls
--> touch a aa aaa b bb bbb
--> ls *[:alpha:]
a aa aaa
--> rm a aa aaa
--> ls *[:alpha:]
ls: cannot access *[:alpha:]: No such file or directory
为什么“*[:alpha:]”会列出 'a*' 个文件名而不是 'b*' 个文件名?
对于那些好奇的人,要获得正确的行为,必须使用 *([[:alpha:]])。但这并不能解释此处出现的不一致。
没有不一致。删除重复字符后,[:alpha:]
等同于 [:alph]
。
所以 ls *[:alpha:]
实际上等同于 ls *[:alph]
,并且只有 a
、aa
和 aaa
匹配,所以这就是你得到的输出。
删除这些文件后,
ls *[:alph]
将找不到匹配项,因此会收到错误消息。
如果要使用 [:alpha:]
字符 class,
你需要写成 [[:alpha:]]
.