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

3

我目前正在尝试重现基本的shell行为,更具体地说是globbing行为。 我正在测试带有花括号的命令,并发现了我不理解的这种行为。

首先,我正在工作的目录的内容如下:

1abc 2abc 3abc abc1 abc2 abc3

然后,我输入了以下命令:ls {[1-3],[a-c]}*,它按预期返回了上面的所有文件。

最后,我尝试了这个命令:ls {{,[1-3]},[a-c]}*,你可以看到其中嵌套了花括号。 现在我不明白的是这个命令的结果,因为它给了我这个:1abc 1abc 2abc 2abc 3abc 3abc abc1 abc1 abc2 abc2 abc3 abc3

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

希望我的解释清楚易懂。

2个回答

3

Bash扩展


{{,[1-3]},[a-c]}*

在第一步(花括号扩展)中,将其转换为
* [1-3]* [a-c]*

在第二步(globbing)中,bash将*扩展为所有文件并且[1-3]*扩展为以123开头的所有文件并且[a-c]*扩展为以abc开头的所有文件。请保留HTML标签。

3

字符串{{,[1-3]},[a-c]}*被解释为花括号扩展,由以下模式组成:

  • "空白" ({,),
  • [1-3],和
  • [a-c]

对于每个模式应用*字符(表示“给定目录中的所有文件名”):

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

你嵌套表达式并不改变它只是“三个模式的列表”的意义。可以使用更简单的表达式,如{,[1-3],[a-c]}*或另一个“列表中的列表”{,{[1-3],[a-c]}}*来实现相同的效果。
如果将表达式传递给echo,它将按顺序打印上面行的所有字符。
$ echo {{,[1-3]},[a-c]}*
1abc 2abc 3abc abc1 abc2 abc3 1abc 2abc 3abc abc1 abc2 abc3

但是ls默认按字母顺序排序条目:
$ ls {{,[1-3]},[a-c]}*
1abc  1abc  2abc  2abc  3abc  3abc  abc1  abc1  abc2  abc2  abc3  abc3

好的,非常感谢您的解释,讲得非常清楚,我现在明白了! - S_Mindcore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接