我使用命令在目录中创建了三个文件touch inv{1..3}.txt。现在,我使用了两个命令,它们的输出几乎相同。这两个命令是ls inv[13].txt和ls {1,3}.txt。
那么这两个有何不同?方括号与括号相比有何不同?我也一直在搜索“ linux [..]”,但是找不到任何东西,所以我能知道在Linux术语中这些东西是什么吗?
谢谢
我使用命令在目录中创建了三个文件touch inv{1..3}.txt。现在,我使用了两个命令,它们的输出几乎相同。这两个命令是ls inv[13].txt和ls {1,3}.txt。
那么这两个有何不同?方括号与括号相比有何不同?我也一直在搜索“ linux [..]”,但是找不到任何东西,所以我能知道在Linux术语中这些东西是什么吗?
谢谢
Answers:
{}称为支撑扩展。它有两种形式:{x..y}和{x,y},更换x和y使用任何字母或数字值。
在第一种形式中,{x..y}将扩展为从x到的所有值y。例如,{2..5}将扩大至2,3,4,5。
在第二个明确的形式,{x,y}将扩大到只x,y。例如,{2,5}将扩展为2和5。
如果无法扩展,则将模式按字面处理,例如{a..3}。
需要注意的重要一点是,在文件创建/匹配时,不管文件是否匹配,都将进行大括号扩展(如果可能)。
[]被称为路径名扩展(或遍历)模式。与括号扩展不同,您只能在匹配文件名时使用它,如果在创建文件时使用它,则会按字面意义对待它。
它有两种形式:[xyz...]和[x-y]。
在第一种形式中,它将单独匹配方括号内的任何单个字符,即每个字符都被单独对待。因此,对于[25].txt它匹配一个文件名为2.txt或5.txt在当前目录,而[245].txt它将匹配命名的任何文件2.txt或4.txt或5.txt。
在第二种形式中,首先进行范围扩展,然后再进行单独匹配,如果可能的话,可以逐字处理。因此[2-5]. txt,它将匹配任何名为2.txtor 3.txt或4.txtor的文件5.txt。如果范围无法扩展,则将按字面处理,例如在的情况下[a-3].txt。
两者之间的重要行为差异是,有更多的模式要匹配,而实际匹配的模式更少。由于括号扩展无论如何都将完成,它将显示错误消息,指出某些文件不存在,而路径名扩展将尽可能匹配,而其余部分则没有任何错误:
$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt
$ ls [1-4].txt
1.txt  2.txt  3.txt便携性注意事项:
的[]路径扩展操作由POSIX Bourne shell和衍生物中,因此便携式定义。
括号扩展{}POSIX没有定义,因此不能在所有shell中移植。例如,   dash(sh在Ubuntu中)没有此功能。这是从借来的csh和某些贝壳将只例如bash,zsh,ksh93,fish。在实施之前,请确保您使用的Shell支持此功能。
例:
$ touch {1..3}.txt
$ ls {1..3}.txt
1.txt  2.txt  3.txt
$ ls {1,2,3}.txt
1.txt  2.txt  3.txt
$ ls {1..4}.txt
ls: cannot access 4.txt: No such file or directory
1.txt  2.txt  3.txt
$ ls {a..3}.txt
ls: cannot access {a..3}.txt: No such file or directory$ ls [123].txt
1.txt  2.txt  3.txt
$ ls [1-3].txt
1.txt  2.txt  3.txt
$ ls [1-4].txt
1.txt  2.txt  3.txt
$ ls [a-3].txt
ls: cannot access [a-3].txt: No such file or directory[ ]没有匹配项时,应避免依赖于扩展行为,因为根据外壳配置的不同,扩展行为可能有所不同。如果要使用[或]在文件名中使用,请在命令中用引号引起来。还值得注意的是{13..79}和之间的区别[13-79]。第一会产生的所有数字范围从13到79,第二个将匹配的字符1,3,4,5,6,7,和9。
                    nullglob(或类似的)目的。关于[13-79]匹配,我想我在回答中清楚地提到了[]的每个字符的行为。
                    ksh具有此功能,但不是更现代的风味,例如mksh和pkdsh
                    两种形式之间的主要区别如下所示:
$ ls inv[15].txt
inv1.txt
$ ls inv{1,5}.txt
ls: cannot access 'inv5.txt': No such file or directory
inv1.txtinv[15].txt是一个glob,将扩展文件系统上匹配文件的列表。这是路径名扩展。
inv{1,5}.txt扩展到文件系统上的实际文件,inv1.txt而inv5.txt不管文件到底是什么。这是大括号扩展。
ba{con,tman}并且使用方括号没有等效项。IOW,大括号扩展不仅限于单个字符。