理解 Bash 中的尖括号
创始人
2024-03-02 01:51:20
0

为初学者介绍尖括号。

Bash 内置了很多诸如 lscdmv 这样的重要的命令,也有很多诸如 grepawksed 这些有用的工具。但除此之外,其实 Bash 中还有很多可以起到胶水作用的标点符号,例如点号(.)、逗号(,)、括号(<>)、引号(")之类。下面我们就来看一下可以用来进行数据转换和转移的尖括号(<>)。

转移数据

如果你对其它编程语言有所了解,你会知道尖括号 <> 一般是作为逻辑运算符,用来比较两个值之间的大小关系。如果你还编写 HTML,尖括号作为各种标签的一部分,就更不会让你感到陌生了。

在 shell 脚本语言中,尖括号可以将数据从一个地方转移到另一个地方。例如可以这样把数据存放到一个文件当中:

ls > dir_content.txt

在上面的例子中,> 符号让 shell 将 ls 命令的输出结果写入到 dir_content.txt 里,而不是直接显示在命令行中。需要注意的是,如果 dir_content.txt 这个文件不存在,Bash 会为你创建;但是如果 dir_content.txt 是一个已有的非空文件,它的内容就会被覆盖掉。所以执行类似的操作之前务必谨慎。

你也可以不使用 > 而使用 >>,这样就可以把新的数据追加到文件的末端而不会覆盖掉文件中已有的数据了。例如:

ls $HOME > dir_content.txt; wc -l dir_content.txt >> dir_content.txt

在这串命令里,首先将家目录的内容写入到 dir_content.txt 文件中,然后使用 wc -l 计算出 dir_content.txt 文件的行数(也就是家目录中的文件数)并追加到 dir_content.txt 的末尾。

在我的机器上执行上述命令之后,dir_content.txt 的内容会是以下这样:

Applications
bin
cloud
Desktop
Documents
Downloads
Games
ISOs
lib
logs
Music
OpenSCAD
Pictures
Public
Templates
test_dir
Videos
17 dir_content.txt

你可以将 >>> 作为箭头来理解。当然,这个箭头的指向也可以反过来。例如,Coen brothers (LCTT 译注:科恩兄弟,一个美国电影导演组合)的一些演员以及他们出演电影的次数保存在 CBActors 文件中,就像这样:

John Goodman 5
John Turturro 3
George Clooney 2
Frances McDormand 6
Steve Buscemi 5
Jon Polito 4
Tony Shalhoub 3
James Gandolfini 1

你可以执行这样的命令:

sort < CBActors
Frances McDormand 6 # 你会得到这样的输出
George Clooney 2
James Gandolfini 1
John Goodman 5
John Turturro 3
Jon Polito 4
Steve Buscemi 5
Tony Shalhoub 3

就可以使用 sort 命令将这个列表按照字母顺序输出。但是,sort 命令本来就可以接受传入一个文件,因此在这里使用 < 会略显多余,直接执行 sort CBActors 就可以得到期望的结果。

如果你想知道 Coens 最喜欢的演员是谁,你可以这样操作。首先:

while read name surname films; do echo $films $name $surname > filmsfirst.txt; done < CBActors

上面这串命令写在多行中可能会比较易读:

while read name surname films;\
 do
 echo $films $name $surname >> filmsfirst;\
 done < CBActors

下面来分析一下这些命令做了什么:

  • while …; do … done 是一个循环结构。当 while 后面的条件成立时,dodone 之间的部分会一直重复执行;
  • read 语句会按行读入内容。read 会从标准输入中持续读入,直到没有内容可读入;
  • CBActors 文件的内容会通过 < 从标准输入中读入,因此 while 循环会将 CBActors 文件逐行完整读入;
  • read 命令可以按照空格将每一行内容划分为三个字段,然后分别将这三个字段赋值给 namesurnamefilms 三个变量,这样就可以很方便地通过 echo $films $name $surname >> filmsfirst;\ 来重新排列几个字段的放置顺序并存放到 filmfirst 文件里面了。

执行完以后,查看 filmsfirst 文件,内容会是这样的:

5 John Goodman
3 John Turturro
2 George Clooney
6 Frances McDormand
5 Steve Buscemi
4 Jon Polito
3 Tony Shalhoub
1 James Gandolfini

这时候再使用 sort 命令:

sort -r filmsfirst

就可以看到 Coens 最喜欢的演员是 Frances McDormand 了。(-r 参数表示降序排列,因此 McDormand 会排在最前面)


via: https://www.linux.com/blog/learn/2019/1/understanding-angle-brackets-bash

作者:Paul Brown 选题:lujun9972 译者:HankChow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

相关内容

大数据开发中常用的shel...
内容目录一、date二、find三、awk四、cut五、if六、s...
2025-05-31 22:29:07
shell常见面试题二
(8)、shell中case语法 #!...
2025-05-30 22:47:54
Shell 的变量功能
什么是变量?? 应该很好理解吧&#x...
2025-05-30 15:50:47
shell常见面试题三
(16)、read读取终端输入 &#x...
2025-05-30 13:17:49
Web漏洞-XSS跨站之订...
一、XSS盲打可测试位置留言板、评论区、订单系统、反馈条件等位置。...
2025-05-29 08:31:04
shell命令如何正确调用...
前言 本文是该专栏的第20篇,后面会持续分享python的各种干...
2025-05-29 06:53:20

热门资讯

PHP最佳实践(译) 简介PHP是一门复杂的语言,经过多年折腾,使其不同版本之间高度不一致,有时还有些bug。 每个版本都...
值得收藏的 27 个机器学习的... 机器学习 ( Machine Learning ) 有很多方面,当我开始研究学习它时,我发现了各种各...
Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
为什么计量 IT 的生产力如此... 在某些行业里,人们可以根据一些测量标准判定一个人的生产力。比如,如果你是一个零件制造商,可以通过一个...
8个有趣的Linux提示与技巧... 我们时不时给你带来关于Linux的提示与技巧。和这个系列保持一致,这里有8个我们从读者收到最有趣的提...
8 个提升你的隐私防护的开源密... 使用一些顶级开源密码管理器,确保你的登录凭证安全无虞。密码管理器是一项非常有用的实用程序。在你想寻找...
硬核观察 #885 苹果 AR... 苹果 AR 眼镜被无限期推迟据报道,由于技术上的挑战,苹果公司已经无限期推迟了其轻型增强现实(AR)...
2020 年的 GitHub ... 距离 2020 年结束只剩下区区 24 天,我们即将结束魔幻的 2020 ,迎来新的一年,新的一年或...
开源新闻速递:openSUSE... 今日关注openSUSE 项目组的 Dominique Leuenberger 在他的周报中说:“这...
KDE4.11 Beta1 正...   KDE 项目工作组刚刚发布了 KDE Software Compilation 4.11 Bet...