为什么[:lower:]在bash中根据文件的存在返回不同的结果?
这在bash中发生在我身上:为什么[:lower:]在bash中根据文件的存在返回不同的结果?,bash,Bash,这在bash中发生在我身上: $ echo HELLO|tr [:upper:] [:lower:] hello $ touch w $ echo HELLO|tr [:upper:] [:lower:] wwwww $ echo [:upper:] [:upper:] $ echo [:lower:] w 对于最初的问题,最明显的解决方法是引用给tr的值。我的问题更多的是当我不引用时发生了什么 我设法减少了一点问题: $ rm w $ echo [:w:] [:w:] $ touch w $
$ echo HELLO|tr [:upper:] [:lower:]
hello
$ touch w
$ echo HELLO|tr [:upper:] [:lower:]
wwwww
$ echo [:upper:]
[:upper:]
$ echo [:lower:]
w
对于最初的问题,最明显的解决方法是引用给tr的值。我的问题更多的是当我不引用时发生了什么
我设法减少了一点问题:
$ rm w
$ echo [:w:]
[:w:]
$ touch w
$ echo [:w:]
w
有人能解释一下发生了什么吗?像
[:lower://这样的表达式是,如果你不把它括在引号里的话。因此,它匹配的文件名正好是方括号中的一个*字符。您可能想简单地引用一下:
$ tr '[:upper:]' '[:lower:]' <<< ABC
abc
$tr'[:upper:][:lower:][:lower:][1]出现了不一致性,因为不匹配任何文件的glob模式会扩展为文本模式,而不是没有文件的列表。这就是为什么echo*.c
可能会为您提供当前目录中的c源文件列表,但echo*.zzzz
会打印“*.zzzz”
。感谢你们两位!看起来冒号也是一种误导。@user3381528冒号在使用标准(由re_format(7)BSD和regex(7)Linux字符类定义)字符类时很重要。使用自定义字符类时,冒号只是另一个字符。更正:[[:lower:]
是匹配单个小写字母的全局模式[:lower://code>是一个括号表达式,它将匹配:
或l
或o
或w
或e
或r
。如果OP确实触摸了u
,那么echo[:lower://code>就不会匹配。@glennjackman叹了口气。谢谢,tr
总是让我感到困惑。我更新了答案。