【问题标题】:How to use curly braces in a shell (bash)如何在 shell (bash) 中使用花括号
【发布时间】:2023-03-17 01:00:02
【问题描述】:

我目前正在尝试重现基本的 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 是如何解释的。

我希望我的解释很清楚。

【问题讨论】:

    标签: linux bash shell glob brace-expansion


    【解决方案1】:

    Bash 扩展

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

    在第一步(大括号扩展)到

    * [1-3]* [a-c]*
    

    在第二步(通配符)中,bash 将* 扩展到所有文件 [1-3]* 扩展到所有以123 开头的文件[a-c]* 扩展到所有以abc 开头的文件。

    【讨论】:

      【解决方案2】:

      字符串{{,[1-3]},[a-c]}* 是解释为brace expansion 的表达式,由以下模式组成:

      • “空虚”({,),
      • [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
      

      【讨论】:

      • 好的,非常感谢这个解释,真的很清楚,我现在明白了!
      猜你喜欢
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 2011-01-12
      • 1970-01-01
      • 2019-01-26
      • 2012-01-27
      • 1970-01-01
      相关资源
      最近更新 更多