当前位置: 首页 > 科技观察

简要了解Bash中的{花括号}

时间:2023-03-21 10:42:51 科技观察

让我们通过仔细研究花括号以及如何以及何时使用它们来继续我们的Bash基础知识之旅。在之前的Bash基础系列中,我们或多或少地使用了一些尚未涉及的符号。在之前文章的很多例子中,我们都用到了括号,但是我们并没有重点关注括号的内容。在本系列的下一篇文章中,我们将研究括号的用法:如何使用这些括号?将它们放在不同的位置有什么不同的效果?除了圆括号、方括号、花括号之外,我们还会接触到其他一些“包裹”一些内容的符号,比如单引号、双引号、反引号等。这周,我们先来看看花括号{}。构造序列花括号在之前的文章《点的含义》中已经出现过。当时只介绍了点..的用法。但是在构造序列的过程中,花括号是不能少的。我们用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]对应的是第四个元素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]}这里花括号的作用不是构造序列,而是扩展参数扩展。顾名思义,参数扩展就是将花括号中的变量扩展成变量的实际内容。我们继续以上面的月份数组为例:month=("Jan""Feb""Mar""Apr""May""Jun""Jul""Aug""Sep""Oct""Nov""Dec")请注意,Bash中的数组索引从0开始,因此3代表第4个元素“Apr”。所以echo${month[3]}等同于参数扩展后的echo"Apr"。像上面那样将一个数组扩展成它的所有元素只是参数扩展的一种用法。此外,还可以通过参数扩展来读取和处理一个字符串变量。例如,对于下面的变量:a="Toolonggg"如果执行:echo${a%gg}可以输出"toolong",即去掉***的两个g。这里${...}告诉shell展开花括号中的内容a是要操作的变量%告诉shell展开字符串后去掉字符串末尾的一些内容gg是要操作的内容去掉了这个功能,在转换文件格式的时候会更有用。让我举个例子:ImageMagick是一组可用于操作图像文件的命令行工具。它有一个转换命令。该转换命令的作用是将某种格式的图像文件复制成另一种格式。以下命令是使用convert将JPEG格式的图片image.jpg转换为PNG格式的图片image.png:convertimage.jpgimage.png许多Linux发行版都预装了ImageMagick。如果没有预装,一般可以在你的发行版的软件管理器中找到。继续看,变量展开后,可以批量进行类似的操作:i=image.jpgconvert$i${i%jpg}png这实际上是去掉了变量i末尾的“jpg”,然后添加“png”最终将整个命令拼接为convertimage.jpgimage.png。如果你不这么认为,想象一下有数百个图像文件需要做这个操作,只需要运行:foriin*.jpg;做转换$i${i%jpg}png;立即完成任务完成。如果需要去掉字符串开头的部分,需要把上面的%改成#:$a="HelloWorld!"$echoGoodbye${a#Hello}GoodbyeWorld!参数扩展的用法有很多,但一般在写脚本的时候才需要。本系列以后的文章中会继续提到它。Mergeoutput***介绍花括号的用法,很简单,就是可以将多条命令的输出合并在一起。首先看下面的命令:echo"IfoundallthesePNGs:";寻找。-iname"*.png";echo"在这一堆文件中:";ls>PNGs.txt以分号分隔命令将被执行,但只有***ls命令的输出将被重定向到PNGs.txt文件。如果这些命令用大括号括起来,像这样:{echo"IfoundallthesePNGs:";寻找。-iname"*.png";echo"在这一堆文件中:";ls;}>PNGs.txt执行后,可以看到PNGs.txt文件中会包含两次echo的内容,find命令找到的PNG文件,以及最新的ls命令结果。需要注意的是花括号和命令之间必须有一个空格。因为这里的花括号{和}是shell中的保留字,所以shell会将这两个符号之间的输出组合起来。此外,每个命令必须用分号分隔;否则命令无法正常运行。