这篇文章将要介绍方括号及其在命令(ling)行中的不同用法。
-- Paul Brown
这篇文章将要介绍方括号及其在命令(ling)行中的不同用法。
看完 花括号在命令行中的(de)用法 之后,现(xian)在我们继续来看方(fang)括号([])在上下文中(zhong)是如何发挥作用的。
通配方括号最(zui)简单的用法就是通配。你可能在知道“ (comGlobbing)”这个概(gai)念之前就已经通过通配来匹配内容了,列出具有相同特征的(de)多个文件就是一个很常见的(de)场景,例如列出所有 JPEG 文件:
ls *.jpg
使用 通配符(wildcard)来得到符合某个模式的所有(you)内容,这个过程就叫通配。
在上面的例子当中,星(xing)号(*)就代表“0 个或多个字符”。除此以外,还(hai)有代表“有且仅有一个字符”的问号(?)。因此
ls d*k*
可以(yi)列出 darkly 和 ducky,而且 dark 和 duck 也是可以被列出的,因为 * 可以匹配 0 个字符。而(er)
ls d*k?
则只(zhi)能列出 ducky,不会列出 darkly、dark 和 duck。
方括号也可以用于通配(pei)。为了便于演示,可以创建一(yi)个用于测试的目录,并在这个(ge)目录下创建文件:
touch file0{0..9}{0..9}
(如果你还不清楚上面这个命令(ling)的原理,可以看一下 另一篇介绍花括号的(de)文章 )
执行上面这个命令之后,就会创(chuang)建 file000、file001、……、file099 这 100 个文件。
如果要列出这(zhe)些文件当中第二位数字是 7 或 8 的文件,可以执行:
ls file0[78]?
如果要列(lie)出 file022、file027、file028、file052、file057、file058、file092、file097、file098,可以执行:
ls file0[259][278]
当然,不仅仅是 ls,很多(duo)其它的命令行工(gong)具都可以使用方括号来进行通配操作。但在删除文件、移动文件、复制文件的过程中使用(yong)通配,你需要有一点横向思(si)维。
例如将 file010 到 file029 这 30 个文件复制成 archive010 到(dao) archive029 这(zhe) 30 个副本,不可以这(zhe)样执行:
cp file0[12]? archive0[12]?
因为通(tong)配只能针对已有的文件,而 archive 开头的文件并不(bu)存在,不能进行通配。
而这条命令
cp file0[12]? archive0[1..2][0..9]
也同样不行(xing),因为 cp 并不允许将多个文件(jian)复制到多个文件。在复制多个(ge)文件的情况下,只能将多个文件(jian)复制到一个指定的目录下(xia):
mkdir archive
cp file0[12]? archive
这(zhe)条命令是可以正常运(yun)行的,但它只会把这 30 个文(wen)件以同样的名称复制到 archive/ 目录下,而这并不是(shi)我们想要的效果(guo)。
如果你阅读过(guo)我 关于花括号的文章 ,你大(da)概会记得可以使用 % 来(lai)截掉字符串的末尾部分,而使(shi)用 # 则可以截(jie)掉字符串的开头部分。
例如:
myvar="Hello World"
echo Goodbye Cruel ${myvar#Hello}
就会输出(chu) Goodbye Cruel World,因(yin)为 #Hello 将 myvar 变量中开头(tou)的 Hello 去掉了。
在通配的过程中,也(ye)可以使用这一个技巧。
for i in file0[12]?;\
do\
cp $i archive${i#file};\
done
上面的第一行(xing)命令告诉 Bash 需要对(dui)所有 file01 开头或者 file02 开头,且(qie)后面只跟一个任意字(zi)符的文件进行操作,第二行的 do 和第四行的 done 代表需要对这些文件(jian)都执行这一块中的命令。
第三行就是实际的复(fu)制操作了,这里使用了两次(ci) $i 变量:第一次在 cp 命令(ling)中直接作为源文件的文件(jian)名使用,第二次则(ze)是截掉文件名开头的 file 部分,然后在(zai)开头补上一个 archive,也就是这样:
"archive" + "file019" - "file" = "archive019"
最终整个 cp 命令展开为:
cp file019 archive019
最(zui)后,顺带说明一下反斜杠 \ 的作用是将一条长(chang)命令拆分成多行,这样可以方便阅读(du)。
在下一节,我们会了解方括(kuo)号的更多用法,敬请关注(zhu)。
via: https://www.linux.com/blog/2019/3/using-square-brackets-bash-part-1
作者: Paul Brown 选题(ti): lujun9972 译者: HankChow 校对: wxy
本文由 LCTT 原创编译, Linux中国(guo) 荣誉推出
点击“了解更多”可访(fang)问文内链接