0%

shell 处理长命令行选项

引言

本文分享一个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
2
3
value=www.skygroup.com
echo ${value#*.}
输出 skygroup.com

解决办法

再回到最开始的问题,我们要写一个shell脚本可同时支持短选项和长选项两种风格的命令行参数,这里介绍其中一种思路,通过getopts命令结合上面讲的变量扩展的知识点解决解析命令行长选项的问题

有了刚才基础知识的铺垫,下面看一段更完整的代码片断

getopts-long-options

假设执行的命令是 x.sh --file-suffix=csv,我们需要从命令行选项--file-suffix=csv中解析出具体的值csv,这里就用到了${value#pattern}的知识点,关键代码如下

1
file_suffix="${OPTARG#*=}"

结语

本文从实际工作场景出发介绍了笔者在写shell脚本时处理命令行选项,特别是长命令行选项的思路。能够处理命令行参数才能使我们的脚本更灵活,在工作中也更容易抽取出可复用的核心脚本。

其中涉及到变量扩展的知识点,因为篇幅限制没有展开细讲,笔者在博客中专门写了一篇关于shell变量扩展的文章,有兴趣的读者可参考。


微信端的朋友也可关注我的公众号

qrcode-12cm