理解 Bash 中的尖括号 | Linux 中国

2019 年 2 月 3 日 Linux中国
为初学者介绍尖括号。
-- Paul Brown


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

转移数据

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

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

   
   
     
  1. ls > dir_content.txt

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

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

   
   
     
  1. 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 的内容会是以下这样:

   
   
     
  1. Applications

  2. bin

  3. cloud

  4. Desktop

  5. Documents

  6. Downloads

  7. Games

  8. ISOs

  9. lib

  10. logs

  11. Music

  12. OpenSCAD

  13. Pictures

  14. Public

  15. Templates

  16. test_dir

  17. Videos

  18. 17 dir_content.txt

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

   
   
     
  1. John Goodman 5

  2. John Turturro 3

  3. George Clooney 2

  4. Frances McDormand 6

  5. Steve Buscemi 5

  6. Jon Polito 4

  7. Tony Shalhoub 3

  8. James Gandolfini 1

你可以执行这样的命令:

   
   
     
  1. sort < CBActors

  2. Frances McDormand 6 # 你会得到这样的输出

  3. George Clooney 2

  4. James Gandolfini 1

  5. John Goodman 5

  6. John Turturro 3

  7. Jon Polito 4

  8. Steve Buscemi 5

  9. Tony Shalhoub 3

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

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

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

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

   
   
     
  1. while read name surname films;\

  2. do

  3. echo $films $name $surname >> filmsfirst;\

  4. done < CBActors

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

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

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

   
   
     
  1. 5 John Goodman

  2. 3 John Turturro

  3. 2 George Clooney

  4. 6 Frances McDormand

  5. 5 Steve Buscemi

  6. 4 Jon Polito

  7. 3 Tony Shalhoub

  8. 1 James Gandolfini

这时候再使用 sort 命令:

   
   
     
  1. sort -r filmsfirst

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


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

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

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


登录查看更多
0

相关内容

Bourne Again Shell 是一个由 Brian Fox 于 1989 年为 GNU 项目编写的、用于替代 Bourne Shell (sh) 的 UNIX shell 程序。 en.wikipedia.org/wiki/B
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
56+阅读 · 2020年6月26日
Python导论,476页pdf,现代Python计算
专知会员服务
254+阅读 · 2020年5月17日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
算法与数据结构Python,369页pdf
专知会员服务
160+阅读 · 2020年3月4日
【新书】Java企业微服务,Enterprise Java Microservices,272页pdf
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
83+阅读 · 2019年11月25日
用 Python 开发 Excel 宏脚本的神器
私募工场
26+阅读 · 2019年9月8日
Kali Linux 渗透测试:密码攻击
计算机与网络安全
16+阅读 · 2019年5月13日
Github项目推荐 | pikepdf - Python的PDF读写库
AI研习社
9+阅读 · 2019年3月29日
抖音爬虫
专知
3+阅读 · 2019年2月11日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
AI 和机器学习中暗含的算法偏见 | Linux 中国
Linux中国
3+阅读 · 2018年4月14日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
别@微信团队了,我用Python给自己戴上了圣诞帽!
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
Arxiv
9+阅读 · 2016年10月27日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【2020新书】使用高级C# 提升你的编程技能,412页pdf
专知会员服务
56+阅读 · 2020年6月26日
Python导论,476页pdf,现代Python计算
专知会员服务
254+阅读 · 2020年5月17日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
【干货书】流畅Python,766页pdf,中英文版
专知会员服务
223+阅读 · 2020年3月22日
算法与数据结构Python,369页pdf
专知会员服务
160+阅读 · 2020年3月4日
【新书】Java企业微服务,Enterprise Java Microservices,272页pdf
【电子书】C++ Primer Plus 第6版,附PDF
专知会员服务
83+阅读 · 2019年11月25日
相关资讯
用 Python 开发 Excel 宏脚本的神器
私募工场
26+阅读 · 2019年9月8日
Kali Linux 渗透测试:密码攻击
计算机与网络安全
16+阅读 · 2019年5月13日
Github项目推荐 | pikepdf - Python的PDF读写库
AI研习社
9+阅读 · 2019年3月29日
抖音爬虫
专知
3+阅读 · 2019年2月11日
如何编写完美的 Python 命令行程序?
CSDN
5+阅读 · 2019年1月19日
AI 和机器学习中暗含的算法偏见 | Linux 中国
Linux中国
3+阅读 · 2018年4月14日
Python 杠上 Java、C/C++,赢面有几成?
CSDN
6+阅读 · 2018年4月12日
别@微信团队了,我用Python给自己戴上了圣诞帽!
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
Top
微信扫码咨询专知VIP会员