如何在一个shell中使用花括号(bash)

我目前正在试图重现基本的shell行为,更具体地说是通配行为。 我用花括号testing命令,发现这种行为,我不明白。 首先,我正在工作的目录的内容如下:

1abc 2abc 3abc abc1 abc2 abc3

然后,我input以下命令: ls {[1-3],[ac]}* ,然后按照预期的方式返回上面的所有文件。

最后,我尝试了这个命令: ls {{,[1-3]},[ac]}* ,正如你所看到的那样,curl的花括号。 现在我不明白的是这个命令的返回,因为它给了我这个: 1abc 1abc 2abc 2abc 3abc 3abc abc1 abc1 abc2 abc2 abc3 abc3

正如你所看到的,所有的文件都被返回了两次,我无法弄清楚shell是如何解释这个的。

我希望我的解释清楚。

字符串{{,[1-3]},[ac]}*是一个解释为括号扩展的表达式,由以下模式组成:

  • “空”( {, ),
  • [1-3]
  • [ac]

*字符(意思是“给定目录中的每个文件名”)适用于它们中的每一个:

 * => 1abc 2abc 3abc abc1 abc2 abc3 [1-3]* => 1abc 2abc 3abc [ac]* => abc1 abc2 abc3 

嵌套表达式的事实不会改变它只是三种模式列表的含义。 用{,[1-3],[ac]}*或另一个“列表列表”(如{,{[1-3],[ac]}}*可以实现同样的效果。

如果将表达式传递给echo ,它将一个接一个地打印上面所有行中的所有字符:

 $ echo {{,[1-3]},[ac]}* 1abc 2abc 3abc abc1 abc2 abc3 1abc 2abc 3abc abc1 abc2 abc3 

但是ls默认按字母顺序排序条目:

 $ ls {{,[1-3]},[ac]}* 1abc 1abc 2abc 2abc 3abc 3abc abc1 abc1 abc2 abc2 abc3 abc3 

Bash扩展

 {{,[1-3]},[ac]}* 

在第一步(括号扩展)

 * [1-3]* [ac]* 

第二步(globbing)bash将所有文件 [1-3]*扩展为所有以23开头的文件, 并将 [ac]*扩展为以abc开始的所有文件。