Bash字符类参数扩展不一致行为

时间:2016-11-20 19:57:00

标签: bash class character parameter-expansion

以下所有步骤似乎都向我提出了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:]])。但这并不能解释这里出现的不一致。

1 个答案:

答案 0 :(得分:4)

没有不一致。删除重复的字符后,[:alpha:]相当于[:alph]。 因此ls *[:alpha:]实际上等同于ls *[:alph],只有aaaaaa匹配,所以这就是你得到的输出。 删除这些文件后 ls *[:alph]将找不到匹配项,因此会收到错误。

如果您想使用[:alpha:]字符类, 你需要写成[[:alpha:]]