繁体   English   中英

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

[英]How to use curly braces in a shell (bash)

我目前正在尝试重现基本的shell行为,更具体地说是全局行为。 我正在用花括号测试命令,发现这种我不明白的行为。 首先,我正在使用的目录的内容如下:

1abc 2abc 3abc abc1 abc2 abc3

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

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

如您所见,所有文件都返回了两次,我无法弄清楚shell是如何解释它的。

我希望我的解释清楚。

Bash扩展

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

在第一步(支撑 - 扩展)到

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

在第二步骤(通配符)的bash膨胀*的所有文件 [1-3]*在开始与所有文件123 膨胀[ac]*的所有文件开始abc

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

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

*字符(表示“给定目录中的每个文件名”)适用于每个字符:

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

嵌套表达式的事实并没有改变它只是三个模式列表的含义。 使用更简单的表达式可以实现相同的效果,如{,[1-3],[ac]}*或其他“列表”,如{,{[1-3],[ac]}}*

如果将表达式传递给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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM