为初学者介绍尖括号。
Bash 内置了很多诸如
ls、cd、mv这样的重要的命令,也有很多诸如grep、awk、sed这些有用的工具。但除此之外,其实 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后面的条件成立时,do和done之间的部分会一直重复执行;- read 语句会按行读入内容。
read会从标准输入中持续读入,直到没有内容可读入;CBActors文件的内容会通过<从标准输入中读入,因此while循环会将CBActors文件逐行完整读入;read命令可以按照空格将每一行内容划分为三个字段,然后分别将这三个字段赋值给name、surname和films三个变量,这样就可以很方便地通过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 会排在最前面)

理解 Bash 中的尖括号
分享