我使用命令在目录中创建了三个文件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.txt
or 3.txt
或4.txt
or的文件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.txt
inv[15].txt
是一个glob,将扩展文件系统上匹配文件的列表。这是路径名扩展。
inv{1,5}.txt
扩展到文件系统上的实际文件,inv1.txt
而inv5.txt
不管文件到底是什么。这是大括号扩展。
ba{con,tman}
并且使用方括号没有等效项。IOW,大括号扩展不仅限于单个字符。