我今天注意到了奇怪的事情
如果我的文件名称为 i 或 o 或 e
并使用方括号内的任何上述字符回显任何字符串 - []然后它始终只打印字符
$ rm -f e i o
$ ls
$ echo [offline]
[offline]
$ echo [online]
[online]
$ echo [error]
[error]
$ echo [soap]
[soap]
如果我删除文件一切正常
{{1}}
那么echo和这些文件名之间的关系是什么?
答案 0 :(得分:1)
shell在命令行参数上执行路径名扩展。路径名扩展依次查看每个未加引号参数,并尝试将其替换为匹配文件名列表。为此,以下通配符适用:
*
表示0个或多个字符,任何字符;
?
表示1个字符,任何字符;
[
< chars> ]
表示1个字符,其中一个字符为< chars>。
如果一个或多个文件名匹配,则命令行参数将替换为匹配文件名列表。如果没有文件名匹配,则命令行参数保持原样。
所以在你的情况下:
[offline]
是一个不带引号的命令行参数,
包含通配符[
... ]
和
文件e
,i
和o
与通配符匹配,因此
shell将参数替换为匹配文件名列表。
道德:始终但始终引用您不希望shell扩展的论据。总是说echo '[offline]'
,永远不要说echo [offline]
。