当前位置: 首页 > news >正文

使用shift关键字,写一个带二级命令的脚本(如:docker run -a -b -c中的run)

省流:shift关键字

探索思路

最近有一个小小的需求,写一个类似于docker run -a -b -c这样的脚本,这个脚本名为doline,它本身可以执行(doline -a -b -c),同时又带有几个如run、init、start这样的参数,感觉有点说不明白,以下是几种场景:

doline -a -b -c      # 直接传参使用
doline -h            # 查看帮助文档
doline init -a -b -c # 初始化一些参数,再次执行时可以不带初始化的参数
doline init -h       # 查看关于'init'的帮助文档
doline run -a -b -c  # ....

有多个类似于init、run这样的二级命令,我之前在【Shell 脚本传递参数的两种方式:位置传参与指令式传参】中详细介绍了Shell的两种传参方式,因此我基于这两种方式开始探索,并有了初步的想法(实操之后发现并不可以)。
首先使用最简单的位置传参,判断$1的值是不是init、run这样的参数,如果不是的话直接getopts如果是的话就在init下面再进行一次getopts,并且在init的结尾进行exit
伪代码大概如下:

## 如果是 doline init -a 123 -b 123 -c 123 就执行下面的代码
if [ $1 = 'init' ] ; thenwhile getopts ":a:b:c:h" optdocase $opt ina)....;;?)echo '未知参数';exit 1;;;esacdoneexit 0;
fi## 如果是 doline -a 123 -b 123 -c 123 就执行下面的代码
while getopts ":a:b:c:h" opt
docase $opt ina)....;;?)echo '未知参数';exit 1;;;esac
done

但是,实操之后失败了,如果是直接doline -a -b -c是可以的,但是doline init的话就全部执行失败,我在代码起始的位置输出所有的参数echo $*,参数是init -a -b -c,这样的话init也占了一个位置,后面的所有参数都对不上位置了,显然是不行的,但是逻辑上是可以的。

成功案例

这时候就要想办法,比如是否有其他的参数获取方式?或者如何在判断是init之后给init这个参数删除掉呢?经过一番查找,找到了一个十分关键的关键词shift切换。

shift 的原理:
如果你输入的参数是init -a -b -c,在读取init之后进行shift,参数列表就变为-a -b -c,这个时候就能对应上了。

这个时候只需要对上面的内容稍加改在,在判断第一个参数是init之后,立刻进行shift就可以了,更改后的脚本如下:

if [ $1 = 'init' ] ; thenshift; # 重读取过的$1之后开始判断命令while getopts ":a:b:c:h" optdocase $opt ina)....;;?)echo '未知参数';exit 1;;;esacdoneexit 0;
fi## 如果是 doline -a 123 -b 123 -c 123 就执行下面的代码
while getopts ":a:b:c:h" opt
docase $opt ina)....;;?)echo '未知参数';exit 1;;;esac
done

以上代码在判断第一个参数是init之后,会立刻进行shift,后面的内容就会一一对应起来了。

简单验证

写个简单的脚本,验证一下:

#!/bin/bashif [ $1 = 'init' ] ; then echo $* ;exit 0;
fiif [ $1 = 'run' ] ; thenshift; ## SHIFT 在这里echo $*;exit 0;
fi

期望输出:

执行./testShift init -a -b -c输出init -a -b -c
执行./testShift run -a -b -c输出-a -b -c

在这里插入图片描述
验证成功!!

参考

Tomcat 启动脚本

http://www.lryc.cn/news/125225.html

相关文章:

  • MySQL学习笔记 - 进阶部分
  • 微信小程序实现左滑删除
  • 安防视频监控有哪些存储方式?哪种存储方式最优?
  • 02-C++数据类型-高级
  • Kotlin实战之获取本地配置文件、远程Apollo配置失败问题排查
  • TCP协议的报头格式和滑动窗口
  • java 使用log4j显示到界面和文件 并格式化
  • 【js】链接中有多余的怎么取出参数值
  • Verdi_traceX and autotrace
  • 安卓逆向 - 某严选app sign算法还原
  • arcgis数据采集与拓扑检查
  • 【前端 | CSS】滚动到底部加载,滚动监听、懒加载
  • word将mathtype公式批量转为latex公式
  • docker-compose部署nacos 2.2.3
  • 软件测试52讲-学习笔记
  • 【ARM 嵌入式 编译系列 4 -- GCC 编译属性 __read_mostly 详细介绍】
  • Maven在IDEA2021版本中全局配置(一次配置处处生效)
  • 名侦探番外——Arduino“炸弹”引爆摩天大楼
  • 自适应AI chatgpt智能聊天创作官网html源码
  • 防抖,节流
  • 【Linux】多线程1——线程概念与线程控制
  • 【Maven】SpringBoot项目使用maven-assembly-plugin插件多环境打包
  • 指令集_基础
  • 学习Vue:数据绑定的基本概念
  • Python 装饰器 - 推导式(列表推导式) - 迭代器 - 生成器 - 闭包
  • 【大数据】Flink 详解(二):核心篇 Ⅲ
  • Jmeter性能测试系列-性能测试需求分析
  • Syncfusion Essential Studio JavaScrip Crack
  • 8.13黄金是否进入下行通道?下周开盘如何布局
  • Idea的基本使用带案例---详细易懂