echo [9876543210]显示1 4 5 6…为什么?


19

请解释为什么最后四个echo语句显示1 4 5 6?我曾经无意中碰到了这个,但是现在我好奇为什么会发生这种行为。

这些语句按预期工作(对我而言)。

$ echo [ 9876543210 ]  
[ 9876543210 ]

$ echo [237890]  
[237890]

这些echo语句始终显示1 4 5 6.这些数字是否有特殊之处?

$ echo [9876543210]  
1 4 5 6

$ echo [abcd9876543210ghi]  
1 4 5 6

$ echo [-123456-]  
1 4 5 6

$ echo [-7654321-]  
1 4 5 6

谢谢!

  • 可能的重复项是相关且有用的,但不是重复项。从rm命令的角度来看,可能的重复项。这个问题是从echo命令的感知“怪异行为”的角度出发的。两者的根本答案都是混乱。有人用echo命令搜索问题不会轻易找到rm问题,而是更有可能落在这里。

16
您在当前目录中有4个文件,分别为:1 4 56
Jeff Schaller

5
Lol,位于metasmoke.erwaysoftware.com/post/58973的机器人将该帖子标记为垃圾邮件,因为它“标题中有电话号码” ...真的吗?
卡罗·伍德

2
@CarloWood,十个连续的数字与带有区号的美国电话号码匹配。使用常规格式编写的将是987-654-3210。
马克

1
请注意,如果打开nullglob,第二个示例(echo [237890])实际上将不打印任何内容,这可能是在其他示例中看到了glob扩展的线索。
凯尔·斯特兰德

Answers:


33

开括号[是外壳的特殊字符;它打开了一个模式匹配算法,该算法表示“匹配括号内的任何字符”。因为在当前目录中有4个文件分别名为:1、4、5和6,所以当方括号内的字符包含这些数字中的任何数字时,您的shell会用这些文件名替换模式匹配。当你改用echo [ 9876543210 ]您所呼叫的回声与3个参数:[9876543210,和]

您应该引用您的echo语句的参数,以防止外壳程序将其视为模式匹配请求。

$ echo '[9876543210]'
[9876543210]

(或删除名为1、4、5和6的文件-但这是演示此行为的一种解决方法,而不是解决方法)。


4
也许说带有三个参数的echo [ 987 ]调用echo比提及甚至更好test
dhag

2
的确会!我回答过度了:(
杰夫·谢勒

1
*我也喜欢您的第一个答案版本,因为我最初在尝试各种测试的echo语句时遇到了这个问题。
MikeD

1
最初的答案甚至都不是真的。他写道:echo [9876543210]。不执行[(因此测试)的调用。
knezi '17

关键是要根据方括号之间以及它们之间的空格,对to的参数进行echo不同的解释bash[123][ 123 ]
jskroch
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.