linux shell中echo命令的错误?

时间:2018-05-23 12:35:14

标签: shell echo

我今天注意到了奇怪的事情

如果我的文件名称为 i o e

并使用方括号内的任何上述字符回显任何字符串 - []然后它始终只打印字符

$ rm -f e i o

$ ls
$ echo [offline]
[offline]

$ echo [online]
[online]

$ echo [error]
[error]

$ echo [soap]
[soap]

如果我删除文件一切正常

{{1}}

那么echo和这些文件名之间的关系是什么?

1 个答案:

答案 0 :(得分:1)

shell在命令行参数上执行路径名扩展。路径名扩展依次查看每个未加引号参数,并尝试将其替换为匹配文件名列表。为此,以下通配符适用:

  • *表示0个或多个字符,任何字符;

  • ?表示1个字符,任何字符;

  • [< chars> ]表示1个字符,其中一个字符为< chars>。

如果一个或多个文件名匹配,则命令行参数将替换为匹配文件名列表。如果没有文件名匹配,则命令行参数保持原样。

所以在你的情况下:

  • [offline]是一个不带引号的命令行参数,

  • 包含通配符[ ... ]

  • 文件eio与通配符匹配,因此

  • shell将参数替换为匹配文件名列表。

道德:始终但始终引用您不希望shell扩展的论据。总是说echo '[offline]',永远不要说echo [offline]