Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么[:lower:]在bash中根据文件的存在返回不同的结果?_Bash - Fatal编程技术网

为什么[:lower:]在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 $

这在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 [: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
总是让我感到困惑。我更新了答案。