深入理解Bash中的尖括号(适合初学者)
前言
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-ldir_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
17dir_content.txt
你可以将>和>>作为箭头来理解。当然,这个箭头的指向也可以反过来。例如,Coenbrothers(LCTT译注:科恩兄弟,一个美国电影导演组合)的一些演员以及他们出演电影的次数保存在CBActors文件中,就像这样:
JohnGoodman5
JohnTurturro3
GeorgeClooney2
FrancesMcDormand6
SteveBuscemi5
JonPolito4
TonyShalhoub3
JamesGandolfini1
你可以执行这样的命令:
sort就可以使用sort命令将这个列表按照字母顺序输出。但是,sort命令本来就可以接受传入一个文件,因此在这里使用<会略显多余,直接执行sortCBActors就可以得到期望的结果。
如果你想知道Coens最喜欢的演员是谁,你可以这样操作。首先:
whilereadnamesurnamefilms;doecho$films$name$surname>filmsfirst.txt;done上面这串命令写在多行中可能会比较易读:
whilereadnamesurnamefilms;\ do echo$films$name$surname>>filmsfirst;\ done下面来分析一下这些命令做了什么:
- while…;do…done是一个循环结构。当while后面的条件成立时,do和done之间的部分会一直重复执行;
- read语句会按行读入内容。read会从标准输入中持续读入,直到没有内容可读入;
- CBActors文件的内容会通过<从标准输入中读入,因此while循环会将CBActors文件逐行完整读入;
- read命令可以按照空格将每一行内容划分为三个字段,然后分别将这三个字段赋值给name、surname和films三个变量,这样就可以很方便地通过echo$films$name$surname>>filmsfirst;\来重新排列几个字段的放置顺序并存放到filmfirst文件里面了。
执行完以后,查看filmsfirst文件,内容会是这样的:
5JohnGoodman
3JohnTurturro
2GeorgeClooney
6FrancesMcDormand
5SteveBuscemi
4JonPolito
3TonyShalhoub
1JamesGandolfini
这时候再使用sort命令:
sort-rfilmsfirst就可以看到Coens最喜欢的演员是FrancesMcDormand了。(-r参数表示降序排列,因此McDormand会排在最前面)
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。