linux引用变量去花括号,linux-如何在shell中使用花括号(bash)

我目前正在尝试重现基本的Shell行为,尤其是重现Globing行为.

我在测试带有花括号的命令时,发现这种行为我不理解.

首先,我正在使用的目录的内容如下:

1abc 2abc 3abc abc1 abc2 abc3

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

最后,我尝试了以下命令:ls {{,[1-3]},[a-c]} *,如您所见,它带有大括号.现在我不明白的是该命令的返回,因为它给了我:1abc 1abc 2abc 2abc 3abc 3abc abc1 abc1 abc1 abc2 abc2 abc3 abc3

如您所见,所有文件都被返回了两次,我无法弄清楚shell是如何解释这一点的.

希望我的解释清楚.

解决方法:

字符串{{,[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

标签:bash,shell,glob,brace-expansion,linux

来源: https://codeday.me/bug/20191026/1936992.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值