引言
本文分享一个shell脚本中处理命令行选项的小技巧,我看到项目中许多shell脚本没有处理命令行参数这部分内容,这也是导致我们写的shell脚本不够灵活,不能抽取成可复用脚本的原因之一,所以分享下自己在这方面的实践。
引出问题
在命令行中通常有两种类型的选项:短命令行选项(short options)和长命令行选项(long options)
- 短命令行选项通常用于提供快速且紧凑的命令行选项 如
-s csv - 长命令行选项通常用于提供更具可读性和描述性的选项 如
--file-suffix=csv
现在需要写一个shell脚本, 可同时支持短选项和长选项,写好后使用方式如下:
- 短选项方式
x.sh -s csv - 长选项方式
x.sh --file-suffix=csv
在shell中getopts可以很好的处理短选项,那如何处理长选项呢?
基础知识铺垫
在解决这个问题之前先做一个基础知识的铺垫
如下的代码,只要写过shell脚本的同学都知道,是引用变量的值。
1 | {value} |
再进一步理解如下的代码,其使用了一种叫变量扩展的知识点
1 | {value#pattern} |
其返回的不是value变量的值,而是一个替换后的值。那又是如何替换的呢?删除value中与pattern相匹配的部分,从左向右匹配,举个例子
1 | value=www.skygroup.com |
解决办法
再回到最开始的问题,我们要写一个shell脚本可同时支持短选项和长选项两种风格的命令行参数,这里介绍其中一种思路,通过getopts命令结合上面讲的变量扩展的知识点解决解析命令行长选项的问题。
有了刚才基础知识的铺垫,下面看一段更完整的代码片断

假设执行的命令是 x.sh --file-suffix=csv,我们需要从命令行选项--file-suffix=csv中解析出具体的值csv,这里就用到了${value#pattern}的知识点,关键代码如下
1 | file_suffix="${OPTARG#*=}" |
结语
本文从实际工作场景出发介绍了笔者在写shell脚本时处理命令行选项,特别是长命令行选项的思路。能够处理命令行参数才能使我们的脚本更灵活,在工作中也更容易抽取出可复用的核心脚本。
其中涉及到变量扩展的知识点,因为篇幅限制没有展开细讲,笔者在博客中专门写了一篇关于shell变量扩展的文章,有兴趣的读者可参考。
微信端的朋友也可关注我的公众号
