在这里,
${...} 告诉 shell 展开花括号里的内容
a 就是需要操作的变量
% 告诉 shell 需要在展开字符串之后从字符串的末尾去掉某些内容
gg 是被去掉的内容
这个特性在转换文件格式的时候会比较有用,我来举个例子:
ImageMagick 是一套可以用于操作图像文件的命令行工具,它有一个 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 会将这两个符号之间的输出内容组合到一起。
另外,各个命令之间要用分号 ; 分隔,否则命令无法正常运行。
【编辑推荐】
- 为什么Linux系统管理员需要编程技能
- 如何在Linux中检查密码的复杂性/强度和评分?
- 在Linux中如何删除文件中的空行
- 一文掌握 Linux 性能分析之网络篇
- 如何在Linux中安装、配置和使用Fish Shell?
【责任编辑:庞桂玉 TEL:(010)68476606】
点赞 0
(编辑:ASP站长网)
|