当前位置: 首页 > 科技观察

Bash中[方括号]的使用(一)

时间:2023-03-20 13:33:18 科技观察

本文将介绍方括号及其在命令行中的不同用法。了解了如何在命令行中使用花括号,现在让我们继续讨论方括号([])在上下文中的工作方式。通用括号的最简单用法是通配。在了解“Globbing”的概念之前,您可能已经使用通配符来匹配内容。列出多个具有相同特征的文件是一个很常见的场景,比如列出所有的JPEG文件:ls*.jpg使用通配符wildcard来获取所有符合某种模式的内容,这个过程称为通配符。在上面的示例中,星号(*)表示“零个或多个字符”。此外,还有一个问号(?)代表“一个且只有一个字符”。所以lsd*k*可以列出darkly和ducky,dark和duck也可以列出,因为*匹配0个字符。还有lsd*k?只能列出ducky,不能列出darkly、dark和duck。方括号也可用于通配。为了演示,可以创建一个测试目录,并在该目录下创建文件:touchfile0{0..9}{0..9}(如果不知道上面命令的原理,可以看看另一篇介绍花括号的文章)执行上面的命令后,会创建file000、file001、...、file099等100个文件。如果要列出这些文件中第二位为7或8的文件,可以执行:lsfile0[78]?如果要列出file022、file027、file028、file052、file057、file058、file092、file097、file098,可以执行:lsfile0[259][278]当然不只是ls,其他很多命令行工具都可以使用square通配符操作的括号。但是在删除文件、移动文件、复制文件的过程中使用通配符需要一点横向的思考。比如要把file010到file029的30个文件复制成archive010到archive029的30份,不能这样执行:cpfile0[12]?存档0[12]?因为通配符只能用于存在的文件,而以archive开头的文件不存在,不能通配。而这个命令cpfile0[12]?archive0[1..2][0..9]也不起作用,因为cp不允??许将多个文件复制到多个文件。在复制多个文件的情况下,只能将多个文件复制到指定目录:mkdirarchivecpfile0[12]?archive这个命令可以正常运行,但是只会把这30个同名的文件复制到archive/目录下,这不是我们想要的。如果你读过我关于花括号的文章,你可能记得你可以使用%截断字符串的结尾,使用#截断字符串的开头。例如:myvar="HelloWorld"echoGoodbyeCruel${myvar#Hello}将输出GoodbyeCruelWorld,因为#Hello从myvar变量中删除了初始的Hello。在外卡的过程中,也可以使用这一招。foriinfile0[12]?;\do\cp$iarchive${i#file};\done上面的第一行命令告诉Bash搜索以file01或file02开头的所有文件,后跟一个任意字符文件operations,第二行的do和第四行的done表示需要对这些文件执行本块中的命令。第三行是实际的复制操作。$i变量在这里用了两次:第一次是在cp命令中直接作为源文件的文件名,第二次是把文件名开头的文件部分截掉,然后在开头添加一个归档,即:"archive"+"file019"-"file"="archive019"最后将整个cp命令展开为:cpfile019archive019最后顺便说下反斜杠\的作用就是把一个长命令拆分成多行,方便阅读。在下一节中,我们将详细了解方括号的用法,敬请期待。