本系列共 4 篇:(一)Shell 技巧 · (二)怎样 getopts · (三)分享与扩展 · (四)C 语言 API

一般来说,我们在使用 GMT 绘制图件时可能会保留一些老的脚本。在需要时拷贝到工作文件夹中,再做适当修改并使用。这种方式的好处是对于特定数据有定制化的绘图脚本,可以方便的分享给他人。但是这种方式的不足即是脚本编写的工作量大、复用性差。而且随着脚本数量的增多,我们可能很难快速找到适用的老脚本。所以,利用 Shell 可编程属性,将常用的绘图流程标准化、模块化是提高 GMT 使用效率的重要一步,也是我们 GMT 脚本进阶的第一步。

本系列将分步骤介绍如何编写模块化的 GMT 脚本,帮助我们在日常使用中达到在任意文件夹内无需编写专门脚本也可以快速出图、批量化出图的要求。本篇内容为 Shell 编程中的一些基础知识,在我们后续的教程中会用到,大家可以先熟悉一下。

本教程中的脚本均在 Bash Shell 中测试通过。Windows 用户可使用 PowerShell

使用变量

Shell 中可声明并使用变量,语法如下:

# 注意变量名称与值之间用等号连接,不能有空格
name="Joe"
age="19"
# 使用变量时需添加$符号或使用${}包含,下面的语句将在终端显示Joe is 19
echo ${name} is ${age}
# 对变量赋值时不需要添加$符号
age=20
# 下面的语句将在终端显示Joe is 20
echo ${name} is ${age}

为保证变量的正确调用,建议在任何时候都使用 ${ } 的方式。需要说明的是 Shell 中的所有变量都是作为字符串处理的,所以 age="19"age=19 的含义是一样的。我们可以使用双引号或单引号来表示一个字符串,不同的是双引号中可包含变量,而单引号内的所有字符都将按照其原意进行处理。

使用函数

Shell 中我们可以将常用方法定义为函数,方便重复使用与管理。语法如下:

# function标识可省略
function <func_name>()
{
	<action>
	# return语句可省略
	<return int>
}

看一个具体的例子:

how_old()
{
	# shell函数的参数拾取是顺序式的,${1}即表示第一个参数,${2}是第二个参数,以此类推
	echo ${1} is ${2}
}

name="Joe"
age="19"
# 调用函数时与使用一般命令的形式一致,即函数名加参数序列
how_old ${name} ${age}

特别地,当我们在终端运行 Shell 脚本时也可以传递参数,形式与函数参数一致。${1} 表示紧跟在脚本名称后的第一个参数,而 ${0} 等于脚本名称。

使用外部函数

文件包含语法

与其他编程语言类似,Shell 同样支持文件包含,即我们可以通过包含其他脚本文件来使用其中的变量或者函数。具体语法格式为:

. filename # 注意点符号与文件名之间的间隔
# 或
source filename

其中 sourcebash 的内部命令,表示运行一个命令或者文件,与 . 符号的作用一样。

使用 gmt_shell_functions.sh

了解了 Shell 的文件包含方法,我们现在尝试调用 GMTgmt_shell_functions.sh 脚本并测试使用其中的函数。此脚本主要包含了一些 GMT 脚本编程中的常用函数,随 GMT 软件一同安装,可视为 GMT 的模版之一。具体函数列表可查看 GMT 官方手册

注意此脚本文件只在 Linux 安装版本中包含,Windows 用户可能需要单独下载脚本文件(下载见文末)并添加到 PowerShell 环境变量中。我们来看下面这个示例脚本(show_range.sh):

#!/bin/bash
# 包含GMT自带脚本文件
. gmt_shell_functions.sh
# 获取命令行第一个参数为.nc文件名称
data=${1}
# 使用gmt_get_gridregion获取网格范围并赋值到变量,注意此处语法为$()。此函数接收的第一个参数为网格文件名称
range=$(gmt_get_gridregion ${data})
# 查看取得的网格范围
echo ${range}

现在使用一个网格文件(sample.nc)来测试此脚本,可以得到如下输出:

$ ./show_range.sh sample.nc
$ 0/1000/0/1000

可见 gmt_get_gridregion 函数返回的是一个格式为 w/e/s/n 的字符串。我们在绘图脚本中可使用此函数自动查询网格文件的范围。注意此函数可接收 -I<dx>/<dy> 选项来帮助其更好地识取网格范围。

以上就是今天我们需要学习的内容啦,很简单吧?下期我们将介绍如何在 Shell 脚本使用中优雅地拾取命令行参数。

想了解更多 Shell 编程技巧,可以参考菜鸟教程 | Shell

示例文件下载

本文涉及的脚本与示例数据:GMT脚本进阶-1.zip

内含:

  • gmt_shell_functions.shGMT 自带的 Shell 函数库(Windows 用户可单独下载使用);
  • show_range.sh:自动获取网格文件范围的示例脚本;
  • sample_func.sh:函数定义与调用的示例脚本;
  • sample.nc:测试用网格文件。

也可关注微信公众号 SciByte 获取更多内容。