在 Bash 中使用[方括号] (一)
看完花括号在命令行中的用法之后,现在我们继续来看方括号([])在上下文中是如何发挥作用的。
方括号最简单的用法就是通配。你可能在知道 Globbing 这个概念之前就已经通过通配来匹配内容了,列出具有相同特征的多个文件就是一个很常见的场景,例如列出所有 JPEG 文件:
ls *.jpg
使用通配符wildcard来得到符合某个模式的所有内容,这个过程就叫通配。
在上面的例子当中,星号(*)就代表 0 个或多个字符 。除此以外,还有代表 有且仅有一个字符 的问号(?)。因此
ls d*k*
可以列出 darkly 和 ducky,而且 dark 和 duck 也是可以被列出的,因为 * 可以匹配 0 个字符。而
ls d*k?
则只能列出 ducky,不会列出 darkly、dark 和 duck。
方括号也可以用于通配。为了便于演示,可以创建一个用于测试的目录,并在这个目录下创建文件:
touch file0{0..9}{0..9}
(如果你还不清楚上面这个命令的原理,可以看一下另一篇介绍花括号的文章)
执行上面这个命令之后,就会创建 file000、file001、 、file099 这 100 个文件。
如果要列出这些文件当中第二位数字是 7 或 8 的文件,可以执行:
ls file0[78]?
如果要列出 file022、file027、file028、file052、file057、file058、file092、file097、file098,可以执行:
ls file0[259][278]
当然,不仅仅是 ls,很多其它的命令行工具都可以使用方括号来进行通配操作。但在删除文件、移动文件、复制文件的过程中使用通配,你需要有一点横向思维。
例如将 file010 到 file029 这 30 个文件复制成 archive010 到 archive029 这 30 个副本,不可以这样执行:
cp file0[12]? archive0[12]?
因为通配只能针对已有的文件,而 archive 开头的文件并不存在,不能进行通配。
而这条命令
cp file0[12]? archive0[1..2][0..9]
也同样不行,因为 cp 并不允许将多个文件复制到多个文件。在复制多个文件的情况下,只能将多个文件复制到一个指定的目录下:
mkdir archive cp file0[12]? archive
这条命令是可以正常运行的,但它只会把这 30 个文件以同样的名称复制到 archive/ 目录下,而这并不是我们想要的效果。
如果你阅读过我关于花括号的文章,你大概会记得可以使用 % 来截掉字符串的末尾部分,而使用 # 则可以截掉字符串的开头部分。
例如:
myvar="Hello World" echo Goodbye Cruel ${myvar#Hello}
就会输出 Goodbye Cruel World,因为 #Hello 将 myvar 变量中开头的 Hello 去掉了。
在通配的过程中,也可以使用这一个技巧。
for i in file0[12]?;/ cp $i archive${i#file};/ done
上面的第一行命令告诉 Bash 需要对所有 file01 开头或者 file02 开头,且后面只跟一个任意字符的文件进行操作,第二行的 do 和第四行的 done 代表需要对这些文件都执行这一块中的命令。
第三行就是实际的复制操作了,这里使用了两次 $i 变量:第一次在 cp 命令中直接作为源文件的文件名使用,第二次则是截掉文件名开头的 file 部分,然后在开头补上一个 archive,也就是这样:
"archive" + "file019" - "file" = "archive019"
最终整个 cp 命令展开为:
cp file019 archive019
最后,顺带说明一下反斜杠 / 的作用是将一条长命令拆分成多行,这样可以方便阅读。
在下一节,我们会了解方括号的更多用法,敬请关注。
via: https://www.linux.com/blog/2019/3/using-square-brackets-bash-part-1
作者:Paul Brown 选题:lujun9972 译者:HankChow 校对:wxy
本文由 LCTT 原创编译,Linux中国 荣誉推出
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/48060.html
linux相关文章
- DFP 数据转发协议应用实例 7.使用 DLS1x 与 VSxxx 设备的 LoRA 匹配
- C++进阶之哈希(unordered_mapu002Fset的使用及其模拟)
- bash shell 使用小技巧
- 使用Python批量筛选上千个Excel文件中的某一行数据并另存为新Excel文件(下篇)
- 使用 Git Extensions 简单入门 Git
- bash 安全漏洞-Bash软件安全漏洞及修复方法
- Jmeter BeanShell使用场景
- eBPF 入门开发实践指南五:在 eBPF 中使用 uprobe 捕获 bash 的 readline 函数调用
- PS2023 新版下载ps2022一键安装永久使用ps2023下载安装教程 PS 2023最新版本
- IIS7.5使用web.config设置伪静态的方法详解程序员
- Shell(Bash)用户自定义变量使用方法详解
- 使用MySQL视图添加更便捷的查询功能(mysql视图添加)
- 版本Linux查看Bash版本: 一步一步指南(linux查看bash)
- bash探索Linux Let Bash的秘密(linux的let)
- 目标探索:在Linux中深入运行Bash(linux中的bash)
- 在 Linux 中使用 Bash 脚本删除早于 “X” 天的文件/文件夹
- 如何使用 Bash history 命令
- Linux操作系统中使用C语言的重要性(linuxsoc)
- 如何在 Android 中使用 MySQL 数据库?(mysql安卓)
- Linux 下添加BASH,让你的操作更强大(linux添加bash)
- Oracle DCL语句的使用及其作用(oracledcl语句)
- Oracle公共表数据的导出与使用(oracle公共表到处)
- 使用Bash脚本简化MySQL数据库连接(bash能连接mysql)
- 开始学习掌握使用bash进行MySQL操作(bash操作mysql)
- 在Linux上详解Oracle数据库的安装与Bash使用(bash oracle)
- MySQL中如何使用反引号(mysql中反引号怎么打)
- MySQL语法如何在不使用逗号的情况下编写SQL语句(MySQL不使用逗号)
- Redis 如何安装与使用(什么是redis怎么安装)
- 使用Redis通道批量删除数据(redis 通道批量删除)
- winform开发使用通用多线程基类分享(以队列形式)