GMT 脚本进阶(三):脚本的分享与扩展
本系列共 4 篇:(一)Shell 技巧 · (二)怎样 getopts · (三)分享与扩展 · (四)C 语言 API 上一篇文章中我们介绍了如何使用 getopts 来获取 GMT 脚本执行时需要的命令行参数。通过使用 getopts 我们已经基本实现了 GMT 绘图过程的对象化,即给一个网格文件画一张图这样的基本操作。这样的工作流程的确很方便,但是它也有它不方便的地方。 其一是你不太可能在编写脚本之初就考虑到以后在使用过程中的所有需求,所以你可能还是需要经常为你的脚本添加和修改命令选项。这当然很好,你的脚本会越来越强大。但是过多的命令选项会让脚本的使用变得越来越困难,其他人可能需要花很多时间来学习它。而且,有的需求其实是一次性的,这时候去修改脚本显然并不划算。另一个不足之处是分享你的脚本将变得困难。设想这样一个情景,你想分享你的数据和对应的绘图脚本给你的同事,你发现你面对的并不是简单地将文件夹打包一下的情况。你需要将你的模版脚本拷贝到文件夹打包发送,然后告诉你的同事怎么使用这个脚本绘图,或者另写一个说明。这无疑增加了整个分享过程的复杂度。要是你的同事想将压缩包分享给第三人,那情况就更复杂了。 看到这里你可能会想“赶紧来点干的啊!”。 干的来了。 本篇教程我们就是要来解决分享与扩展性的问题,即如何将脚本特例化。什么意思?为了应对分享与扩展性这两个问题,我们的解决思路是在需要的时候为特定的数据(集)自动生成对应的绘图脚本。这个脚本内只包含 GMT 绘图命令,所以可以在任何装有 GMT 的电脑上运行。你的同事面对的只是单纯的 GMT 脚本,因此不需要额外学习任何其他知识。同时,你自己可以使用生成的脚本进行二次编辑,从而满足额外的绘图需求。这样就大大提高了模版脚本的扩展性。 说了这么多,到底怎么弄? 答:写一个 Shell 函数,接收一个规则字符串和一个命令字符串,视规则执行或者打印命令字符串。就是说每当我们要执行一条 GMT 绘图命令时都要经过这个函数。如果我们想要绘图,这个时候就执行这个绘图命令;如果我们想要得到的是命令本身,就打印这条命令。 有了这个思路,我们来直接看这个函数: # 执行输入的语句或者将其显示在屏幕上 参数1(0显示 1执行)参数2(命令语句)参数3(命令语句) RunOrEcho() { # 预处理 去除命令语句中的制表符 first_str=`echo ${2// /''}` # 判断第三个参数是否存在 if [[ x${3} != x ]]; then sec_str=`echo ${3// /''}` fi # 如果第一个参数为1则执行命令语句 否则在屏幕上显示命令语句 if [[ ${1} == 1 ]]; then ${first_str} if [[ x${3} != x ]]; then ${sec_str} fi else if [[ x${3} != x ]]; then printf "%s\n%s\n" "${first_str}" "${sec_str}" else printf "%s\n" "${first_str}" fi fi } 简单地测试一下这个函数: ...