在 Bash 中使用[方括号] (一)
创始人
2024-03-02 02:16:17
0

square brackets

这篇文章将要介绍方括号及其在命令行中的不同用法。

看完花括号在命令行中的用法之后,现在我们继续来看方括号([])在上下文中是如何发挥作用的。

通配

方括号最简单的用法就是通配。你可能在知道“ Globbing ”这个概念之前就已经通过通配来匹配内容了,列出具有相同特征的多个文件就是一个很常见的场景,例如列出所有 JPEG 文件:

ls *.jpg

使用 通配符 wildcard 来得到符合某个模式的所有内容,这个过程就叫通配。

在上面的例子当中,星号(*)就代表“0 个或多个字符”。除此以外,还有代表“有且仅有一个字符”的问号(?)。因此

ls d*k*

可以列出 darklyducky,而且 darkduck 也是可以被列出的,因为 * 可以匹配 0 个字符。而

ls d*k?

则只能列出 ducky,不会列出 darklydarkduck

方括号也可以用于通配。为了便于演示,可以创建一个用于测试的目录,并在这个目录下创建文件:

touch file0{0..9}{0..9}

(如果你还不清楚上面这个命令的原理,可以看一下另一篇介绍花括号的文章

执行上面这个命令之后,就会创建 file000file001、……、file099 这 100 个文件。

如果要列出这些文件当中第二位数字是 7 或 8 的文件,可以执行:

ls file0[78]?

如果要列出 file022file027file028file052file057file058file092file097file098,可以执行:

ls file0[259][278]

当然,不仅仅是 ls,很多其它的命令行工具都可以使用方括号来进行通配操作。但在删除文件、移动文件、复制文件的过程中使用通配,你需要有一点横向思维。

例如将 file010file029 这 30 个文件复制成 archive010archive029 这 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,因为 #Hellomyvar 变量中开头的 Hello 去掉了。

在通配的过程中,也可以使用这一个技巧。

for i in file0[12]?;\
do\
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中国 荣誉推出

相关内容

不要打印结果时带有方括号
要解决这个问题,你可以使用Python中的join函数将结果转换为...
2025-01-10 18:00:58
不使用方括号初始化整数数组...
要实现不使用方括号初始化整数数组,可以使用动态内存分配来创建数组,...
2024-12-28 15:31:19
不使用方括号“[]”旋转矩...
以下是一个不使用方括号的旋转矩阵的解决方法的示例代码:def ro...
2024-12-28 15:30:44
不能使用点表示法或方括号表...
如果不能使用点表示法或方括号表示法来访问数组,你可以使用Objec...
2024-12-27 06:01:34
捕获外层括号/方括号组,同...
在编程中,我们可以使用栈数据结构来解决这个问题。具体步骤如下:创建...
2024-12-25 07:01:49
编写程序询问用户输入括号和...
此问题可以用栈的数据结构来解决。我们可以遍历用户输入的括号和方括号...
2024-12-05 05:30:47

热门资讯

Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
Epic 游戏商店现在可在 S... 现在可以在 Steam Deck 上运行 Epic 游戏商店了,几乎无懈可击! 但是,它是非官方的。...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
从 Yum 更新中排除特定/某... 作为系统更新的一部分,你也许需要在基于 Red Hat 系统中由于应用依赖排除一些软件包。如果是,如...
通过 SaltStack 管理... 我在搜索Puppet的替代品时,偶然间碰到了Salt。我喜欢puppet,但是我又爱上Salt了:)...
如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
Opera 浏览器内置的 VP... 昨天我们报道过 Opera 浏览器内置了 VPN 服务,用户打开它可以防止他们的在线活动被窥视。不过...
如何检查你的 Linux 系统... 不知道在使用哪个初始化系统?以下是方法。每个主流 Linux 发行版(包括 Ubuntu、Fedor...