36.2 shell wrappers
wrapper是一个包含系统命令和工具的脚本,脚本会把一些参数传递给这些(脚本内的)命令。将一个复杂的命令封装成一个wrapper是为了调用它时比较简单好记,特别在使用sed和awk命令时会这么做。
sed或awk脚本通常在命令行下调用时是sed -e '命令'或者awk '命令'。在Bash脚本中嵌入这些命令会让它们在调用时很简单,并且能够被重用。使用这种方法可以将sed和awk的优势统一起来,比如将sed命令处理的结果通过管道传递给awk继续处理。将这些保存成为一个可执行文件,你可以重复调用它的原始版本或者修改版本,而不用在命令行里反复敲冗长的命令。
Example 36-1. shell wrapper
#!/bin/bash
# 这个脚本功能是去除文件中的空白行
# 没有做参数检查
#
# 也许你想添加下面的内容:
#
# E_NOARGS=85
# if [ -z "$1" ]
# then
# echo "Usage: `basename $0` target-file"
# exit $E_NOARGS
# fi
sed -e /^$/d "$1"
# 就像这个命令
# sed -e '/^$/d' filename
# 通过命令行调用
# '-e'意思是后面为编辑命令(这个选项可省略)。
# '^'代表行首,'$'代表行尾。
# 这个正则表达式表示要匹配出所有行首位没有内容的行,就是空白行。
# 是删除命令(译注:就是把刚才选出来的空白行删掉)
# 将文件名中的特殊字符和空白进行转译
# 这个脚本并不会真正的修改目标文件,如果想对目标文件真正的修改,请将输出重定向
exitExample 36-2. 稍微复杂一点的 shell wrapper
Example 36-3. 一个通用的写日志文件的 shell wrapper
Example 36-4. 关于awk脚本的 shell wrapper
Example 36-5. 另一个关于awk的 shell wrapper
能满足那些需要瑞士军刀般全能工具的脚本语言,就只有Perl了。Perl集合了sed和awk的能力,并且比C更加精简。它是模块化的并且能支持包括厨房洗碗槽在内的所有面向对象编程所能涉及的事物。短小的Perl脚本可以嵌入shell脚本中,甚至Perl可以完全替代shell脚本。(本书作者对此仍然抱有怀疑)
Example 36-6. Perl嵌入Bash脚本
即使能将Bash脚本和Perl脚本合二为一,先执行Bash部分还是Perl部分仍然要取决于调用脚本的方式。
Example 36-7. Bash和Perl脚本合并
当然还可以用shell wrapper嵌入更多的“外来户”,比如Python或者其他的...
Example 36-8. Python嵌入Bash脚本
使用脚本封装mplayer或者Google翻译服务器的一些功能,你能做出给你反馈一些信息的小东西。
Example 36-9. 会讲话的脚本
有个有趣的shell wrapper例子是Martin Matusiak的undvd,为复杂的mencoder工具提供了一个简单易用的命令行接口。另一个例子是Itzchak Rehberg的Ext3Undel,它为在ext3文件系统上恢复删除的文件提供了一整套工具。
Notes [1] Linux工具事实上很多是shell wrapper,比如/usr/bin/pdf2ps,/usr/bin/batch和/usr/bin/xmkmf。
最后更新于
这有帮助吗?