Bash {花括号}用法

1 数组构造

基本形式是:{x..y[..incr]},x、y可以同时是整数或者单个字母,incr是一个可选项,表示增量,是一个整数。
当x、y是整数时,这个表达式扩展为包括x、y在内的所有数。整数可以前缀0,表示打印相同长度的0前缀整数。
当x、y是字母时,这个表达式扩展为包括x、y在内的所有字母(按字典序)。
当使用incr时,incr表示了每个项之间的差,默认是1。

echo {0..10}打印整数0到10。

$ echo {0..10}
0 1 2 3 4 5 6 7 8 9 10

echo {10..0}打印同样的数,不过是反向。

$ echo {0..10}
10 9 8 7 6 5 4 3 2 1

echo {10..0..2}间隔打印整数,每隔一个打印一个,从10开始,一直退到0。

$ echo {10..0..2}
10 8 6 4 2 0

echo {z..a..2}间隔打印字母,每隔一个打印一个,从z到a。

$ echo {z..a..2}
z x v t r p n l j h f d b

echo {a..c}{a..c}打印两个字母的组合,从aa到cc。

$ echo {a..c}{a..c}
aa ab ac ba bb bc ca cb cc

在Bash中,你可以这样来构造数组:

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

letter_combos指向一个包括整个字母表中字母组合的数组。

你也可以这样:

$ 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

2 参数扩展

这里将$和{}组合使用。

上面的dec2bin其实就涉及了参数扩展,我们来看个简单的:

$ month=("Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec")
$ echo ${month[3]}
Apr

其中month是一个数组,数组中第3项(从0开始)是Apr,于是${month[3]}在扩展后就成了Apr。注意这里不能省略{},否则输出Jan[3],因为要将month[3]看成一个整体。

你也可以用参数扩展来操作变量,比如说,删除尾部的字符串:

$ a="Too longgg"
$ echo ${a%gg}
Too long

拆开来讲:

  • ${...}告诉shell要扩展这其中的内容,
  • a是要处理的变量,
  • %告诉shell你想要从变量的尾部删除字符串,
  • gg是要删除的字符串。

这个用法在转换文件格式时很方便。

ImageMagick是一系列操作和修改图像的命令行工具。其中最有用的工具是convert。在其最简单的形式下,convert可以复制并转换图像的格式。

下面的命令将一个名为image.jpg的JPEG格式图片复制并转换成名为image.png的PNG格式图片:

$ convert image.jpg image.png

利用参数扩展,你可以用以下命令达到相同效果:

$ i=image.jpg
$ convert $i ${i%jpg}png

你所做的就是从变量i中删除后缀jpg,然后再加上后缀png。

所以当你有大批量的JPEG图片需要转换时,就很方便了:

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

除了删除尾部字符串,还有其他操作形式:

  • ${parameter:-word}
    如果parameter未被设置或为空,就带入word;否则带入parameter的值。
  • ${parameter:=word}
    如果parameter未被设置或为空,就带入word且parameter设置为word;否则带入parameter的值。位置参数不能用这种方式赋值。
  • ${parameter:?word}
    如果parameter未被设置或为空,打印错误word并退出shell,省略word会打印错误:parameter null or not set;否则带入parameter的值。
  • ${parameter:+word}
    如果parameter未被设置或为空,就带入空,否则带入parameter的值。
    注意:上面word可以是一个变量,使用$word的形式引用其值
  • ${parameter:offset}
    截取parameter中offset开始的字符串。
  • ${parameter:offset:length}
    截取parameter中offset开始长为length的字符串。
    注意:上面的offset和length必须为整数。offset和length可以是变量,使用$offset$length引用其值
  • ${#parameter}
    表示字符串变量的长度;如果parameter是*或@,则扩展为位置参数的个数;如果parameter是数组(以month[@]形式出现),则表示数组的长度。
  • ${parameter#pattern}
    把字符串变量前缀与模式进行最小匹配,并删除匹配到的部分。
  • ${parameter##pattern}
    把字符串变量前缀与模式进行最大匹配,并删除匹配到的部分。
  • ${parameter%pattern}
    把字符串变量后缀与模式进行最小匹配,并删除匹配到的部分。
  • ${parameter%%pattern}
    把字符串变量后缀与模式进行最大匹配,并删除匹配到的部分。
  • ${parameter/pattern/string}
    使用string替换pattern的最大匹配部分。如果pattern以/开头则进行全部替换,否则只替换第一个匹配的位置;如果pattern以#开头,则匹配变量前缀;如果以%开头,则匹配变量后缀。
    注意:上面的pattern可以是变量,使用$pattern引用其值;如果parameter是*、@或数组(以month[@]形式出现),则对其中每一个元素都进行匹配操作。

3 组合输出

使用{ ... }来把多个命令的输入组合。比如有个命令:

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

最终输出到PNGs.txt的只有最后一个ls的输出。

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

这样生成的PNGs.txt会包含所有输出:第一行是“I found all these PNGs:”,然后是一组用find命令找到的PNG文件名,然后是一行“Within this bunch of files:”,最后是当前目录下所有文件和目录的列表。

注意{}内部的命令前后需要有一个空格,而且命令需要以分号结尾(在脚本中可以是换行)。

4 参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容