原创: 译者/Hank Chow Linux中国 Linux中国

微信号 linux-cn

功能介绍 十万级技术订阅号,依托于『Linux中国』(https://linux.cn/)社区,专注于 Linux 学习、技术研究、开源思想传播。

在前面的 Bash 基础系列文章中,我们或多或少地使用了一些还没有讲到的符号。在之前文章的很多例子中,我们都使用到了括号,但并没有重点讲解关于括号的内容。

这个系列接下来的文章中,我们会研究括号们的用法:如何使用这些括号?将它们放在不同的位置会有什么不同的效果?除了圆括号、方括号、花括号以外,我们还会接触另外的将一些内容“包裹”起来的符号,例如单引号、双引号和反引号。

在这周,我们先来看看花括号 {}

构造序列

花括号在之前的《点的含义[1]》这篇文章中已经出现过了,当时我们只对点号 . 的用法作了介绍。但在构建一个序列的过程中,同样不可以缺少花括号。

我们使用

echo {0..10}

来顺序输出 0 到 10 这 11 个数。使用

echo {10..0}

可以将这 11 个数倒序输出。更进一步,可以使用

echo {10..0..2}

来跳过其中的奇数。

echo {z..a..2}

则从倒序输出字母表,并跳过其中的第奇数个字母。

以此类推。

还可以将两个序列进行组合:

echo {a..z}{a..z}

这个命令会将从 aa 到 zz 的所有双字母组合依次输出。

这是很有用的。在 Bash 中,定义一个数组的方法是在圆括号 () 中放置各个元素并使用空格隔开,就像这样:

month=("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")

如果需要获取数组中的元素,就要使用方括号 [] 并在其中填入元素的索引:

$ echo ${month[3]} # 数组索引从 0 开始,因此 [3] 对应第 4 个元素

Apr

先不要过分关注这里用到的三种括号,我们等下会讲到。

注意,像上面这样,我们可以定义这样一个数组:

letter_combos=({a..z}{a..z})

其中 letter_combos 变量指向的数组依次包含了从 aa 到 zz 的所有双字母组合。

因此,还可以这样定义一个数组:

dec2bin=({0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1}{0..1})

在这里,dec2bin 变量指向的数组按照升序依次包含了所有 8 位的二进制数,也就是 00000000、00000001、00000010,……,11111111。这个数组可以作为一个十进制数到 8 位二进制数的转换器。例如将十进制数 25 转换为二进制数,可以这样执行:

$ echo ${dec2bin[25]}

00011001

对于进制转换,确实还有更好的方法,但这不失为一个有趣的方法。

参数展开

再看回前面的

echo ${month[3]}

在这里,花括号的作用就不是构造序列了,而是用于参数展开parameter expansion。顾名思义,参数展开就是将花括号中的变量展开为这个变量实际的内容。

我们继续使用上面的 month 数组来举例:

month=("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")

注意,Bash 中的数组索引从 0 开始,因此 3 代表第 4 个元素 "Apr"。因此 echo ${month[3]} 在经过参数展开之后,相当于 echo "Apr"

像上面这样将一个数组展开成它所有的元素,只是参数展开的其中一种用法。另外,还可以通过参数展开的方式读取一个字符串变量,并对其进行处理。

例如对于以下这个变量:

a="Too longgg"

如果执行:

echo ${a%gg}

可以输出 “too long”,也就是去掉了最后的两个 g。

在这里,

◈ ${...} 告诉 shell 展开花括号里的内容

◈ a 就是需要操作的变量

◈ % 告诉 shell 需要在展开字符串之后从字符串的末尾去掉某些内容

◈ gg 是被去掉的内容

这个特性在转换文件格式的时候会比较有用,我来举个例子:

ImageMagick[2] 是一套可以用于操作图像文件的命令行工具,它有一个 convert 命令。这个 convert 命令的作用是可以为某个格式的图像文件制作一个另一格式的副本。

下面这个命令就是使用 convert 为 JPEG 格式图像 image.jpg 制作一个 PNG 格式的图像副本 image.png

convert image.jpg image.png

在很多 Linux 发行版中都预装了 ImageMagick,如果没有预装,一般可以在发行版对应的软件管理器中找到。

继续来看,在对变量进行展开之后,就可以批量执行相类似的操作了:

i=image.jpg

convert $i ${i%jpg}png

这实际上是将变量 i 末尾的 "jpg" 去掉,然后加上 "png",最终将整个命令拼接成 convert image.jpg image.png

如果你觉得并不怎么样,可以想象一下有成百上千个图像文件需要进行这个操作,而仅仅运行:

for i in *.jpg; do convert $i ${i%jpg}png; done

就瞬间完成任务了。

如果需要去掉字符串开头的部分,就要将上面的 % 改成 # 了:

$ a="Hello World!"

$ echo Goodbye${a#Hello}

Goodbye World!

参数展开还有很多用法,但一般在写脚本的时候才会需要用到。在这个系列以后的文章中就继续提到。

合并输出

最后介绍一个花括号的用法,这个用法很简单,就是可以将多个命令的输出合并在一起。首先看下面这个命令:

echo "I found all these PNGs:"; find . -iname "*.png"; echo "Within this bunch of files:"; ls > PNGs.txt

以分号分隔开的几条命令都会执行,但只有最后的 ls 命令的结果输出会被重定向到 PNGs.txt文件中。如果将这几条命令用花括号包裹起来,就像这样:

{ echo "I found all these PNGs:"; find . -iname "*.png"; echo "Within this bunch of files:"; ls; } > PNGs.txt

执行完毕后,可以看到 PNGs.txt 文件中会包含两次 echo 的内容、find 命令查找到的 PNG 文件以及最后的 ls 命令结果。

需要注意的是,花括号与命令之间需要有空格隔开。因为这里的花括号 { 和 } 是作为 shell 中的保留字,shell 会将这两个符号之间的输出内容组合到一起。

另外,各个命令之间要用分号 ; 分隔,否则命令无法正常运行。

via: https://www.linux.com/blog/learn/2019/2/all-about-curly-braces-bash

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

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

浅析 Bash 中的 {花括号} | Linux 中国相关推荐

  1. python大括号_我不能在Python中使用花括号吗?

    我读到Python通过缩进而不是花括号来完成它所有的"代码块". 那正确吗? 所以函数,如果这样的东西都没有用花括号包围它们的块? stackoverflow.com/questi ...

  2. 在windows上的git bash中安装tree 和 linux tree命令使用

    在windows上的git bash中安装tree 和 linux tree命令使用 文章目录: 1 在windows上的git bash中安装tree 1.1 下载windows版本的tree 1. ...

  3. C/C++中无条件花括号的妙用

    C/C++中无条件花括号可以形成一个代码块,一个作用域.可以使括号内定义的变量就只在本域(就是这个大括号)内有效,而且不会影响其他域,即使名字相同. 在花括号内,如果变量前面带类型,则相当于新创建一个 ...

  4. 栈练习之Example005-检查一个程序中的花括号、方括号和圆括号是否配对

    Example005 题目 试编写一个算法,检查一个程序中的花括号.方括号和圆括号是否配对,若全部配对,则返回1,否则返回0.对于程序中出现的一对单引号或双引号内的字符不进行括号配对检查.39为单引号 ...

  5. shell脚本中的花括号扩展

    shell脚本中的花括号扩展 在shell脚本中可以在花括号中使用一组以逗号分隔的字符串或者字符串序列来进行字符串扩展,最终输出的结果为以空格分隔的字符串(整数也可) [root@mao_aliyun ...

  6. linux中_在 Linux 桌面中开始使用 Lumina | Linux 中国

    本文是 24 天 Linux 桌面特别系列的一部分.Lumina 桌面是让你使用快速.合理的基于 Fluxbox 桌面的捷径,它具有你无法缺少的所有功能.-- Seth Kenlon 多年来,有一个名 ...

  7. linux怎样自动检查link文件_怎样理解和识别 Linux 中的文件类型 | Linux 中国

    众所周知,在 Linux 中一切皆为文件,包括硬盘和显卡等.在 Linux 中导航时,大部分的文件都是普通文件和目录文件.但是也有其他的类型,对应于 5 类不同的作用.因此,理解 Linux 中的文件 ...

  8. html列表按时间排序代码_把 Linux 上的文件列表和排序玩出花来 | Linux 中国

    导读:Linux 命令可以提供文件的详细信息,也可以自定义显示的文件列表,甚至可以深入到文件系统的目录中,只要你愿意看.本文字数:5090,阅读时长大约:6分钟https://linux.cn/art ...

  9. linux重启网卡命令_如何在 Linux 中更改 MAC 地址 | Linux 中国

    在向你展示如何在 Linux 中更改 Mac 地址之前,让我们首先讨论为什么要更改它.-- Dimitrios Savvopoulos 在向你展示如何在 Linux 中更改 MAC 地址之前,让我们首 ...

最新文章

  1. dedecms网站文章内容按自定义排序的方法
  2. 2018-2019-2 网络对抗技术 20165324 Exp4:恶意代码分析
  3. IHttpHandler的学习(0)
  4. 4.7 CNN 特征可视化-深度学习第四课《卷积神经网络》-Stanford吴恩达教授
  5. 副本放置策略Copysets论文解读及工程实践
  6. 使用FontAwesome
  7. python爬虫07--代理
  8. 模拟jQuery,简单仿写API
  9. dos初始操作和全屏方法
  10. eclipse修改xml文件默认的打开方式为XML Editor
  11. 四川大学转专业到计算机学院面试,2016年本科生转专业工作面试通知
  12. goland 注释模板_【精品】金工实习心得体会模板合集5篇
  13. 口碑营销遇见互联网,企业如何做好网络口碑营销?
  14. 解耦——Hybrid H5跨平台性思考
  15. 9 与python2交互
  16. 教你关闭烦人的“程序兼容性助手”~~~~~
  17. 不用/,*,mod乘、除、取模运算的除法
  18. java 格式化数字(每三位加逗号),保留两位小数。
  19. 河南信息统计学院微信公众平台API汇总
  20. 基于springboot开发的停车场管理系统-计算机毕业设计

热门文章

  1. Java并发编程-synchronized底层原理
  2. TCP/IP具体解释--TCP的分段和IP的分片
  3. LVDS原理及设计指南
  4. C# 数据类型转换
  5. 解决android帮助文档打开慢
  6. java单击按钮切换图片_JAVA点击按钮改变背景图片 跪求代码·
  7. scp传服务器文件,使用tar、scp和screen在服务器之间传输文件
  8. 虚拟机安装日志服务器,rsyslog日志服务器搭建
  9. centos7 安装jdk_Centos 7安装和配置 ElasticSearch入门小白
  10. java聊天系统异常问题_【图片】写的socket编程实现窗口聊天出现空指针错误 在自己电脑没事【java吧】_百度贴吧...