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

news2024/11/26 22:18:11

省流: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' ] ; then
	while getopts ":a:b:c:h" opt
	do
		case $opt in
			a)
				....
				;;
			?)
				echo '未知参数';
				exit 1;
				;;
		esac
	done
	exit 0;
fi

## 如果是 doline -a 123 -b 123 -c 123 就执行下面的代码
while getopts ":a:b:c:h" opt
do
	case $opt in
		a)
			....
			;;
		?)
			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' ] ; then
	shift; # 重读取过的$1之后开始判断命令
	while getopts ":a:b:c:h" opt
	do
		case $opt in
			a)
				....
				;;
			?)
				echo '未知参数';
				exit 1;
				;;
		esac
	done
	exit 0;
fi

## 如果是 doline -a 123 -b 123 -c 123 就执行下面的代码
while getopts ":a:b:c:h" opt
do
	case $opt in
		a)
			....
			;;
		?)
			echo '未知参数';
			exit 1;
			;;
	esac
done

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

简单验证

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

#!/bin/bash

if [ $1 = 'init' ] ; then 
    echo $* ;
    exit 0;
fi

if [ $1 = 'run' ] ; then
    shift; ## 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.coloradmin.cn/o/872209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Pytroch】基于K邻近算法的数据分类预测(Excel可直接替换数据)

【Pytroch】基于K邻近算法的数据分类预测(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果 1.模型原理 K最近邻(K-Nearest Neighbors,简称KNN)是一种简单但常用的机器…

python编程基础与案例集锦,python编程入门经典

大家好,本文将围绕python编程基础与案例集锦展开说明,python编程入门与案例详解是一个很多人都想弄明白的事情,想搞清楚python入门程序例子需要先了解以下几个事情。 【程序1】 题目:输入一行字符,分别统计出其中英文字…

【c++】七夕快到了却还没对象?手把手教你new一个出来!

前言 本章给大家带来的是C内存管理。在C语言阶段,我们经常使用malloc,calloc,realloc,free进行内存管理。但是,C语言的内存管理存在很多缺陷,会对程序的稳定性和安全性造成影响。 不过,C语言的…

cubemx hal stm32 舵机 可减速 任意位置停止 驱动代码

CubeMX配置 对于 STM32 F407VE 这里的84是来自APB1那路2倍频得到: 代码部分 两个舵机都是180度的 servo.c #include "servo.h" #include "tim.h" #include "stdio.h"__IO uint32_t g_SteerUWT[2] {0}; uint16_t g_SteerDeg[…

开发一个RISC-V上的操作系统(七)—— 硬件定时器(Hardware Timer)

目录 往期文章传送门 一、硬件定时器 硬件实现 软件实现 二、上板测试 往期文章传送门 开发一个RISC-V上的操作系统(一)—— 环境搭建_riscv开发环境_Patarw_Li的博客-CSDN博客 开发一个RISC-V上的操作系统(二)—— 系统引导…

Monkey测试真的靠谱吗?

Monkey测试,顾名思义,就是模拟一只猴子在键盘上乱敲,从而达到测试被测系统的稳定性。Monkey测试,是Android自动化测试的一种手段,Monkey测试本身非常简单,Android SDK 工具支持adb Shell命令,实…

jvm里的内存溢出

目录 堆溢出 虚拟机栈和本地方法栈溢出(栈溢出很少出现) 方法区和运行时常量池溢出 本机内存直接溢出(实际中很少出现、了解即可) 堆溢出 堆溢出:最常见的是大list,list里面有很多元素 堆溢出该怎么解决…

C++红黑树

一、红黑树的概念 红黑树是一种二叉搜索树,在其每个节点上增加一个存储位用于表示节点的颜色,可以是Red或Black 通过对任何一条从根到叶子的路径上的各个节点着色方式的限制,红黑树确保没有一条路径比其他路径长两倍 红黑树的性质&#xff…

SQL | 汇总数据

9-汇总数据 9.1-聚集函数 在实际开发过程中,可能会遇到下面这些情况: 确定大于某个值的有多少行数据,比如游戏排行榜,查询玩家排行多少名。 获取表中某些行的和,比如双十一当天,某个用户总订单价格是多少…

208、仿真-51单片机脉搏心率与心电报警Proteus仿真设计(程序+Proteus仿真+配套资料等)

毕设帮助、开题指导、技术解答(有偿)见文未 目录 一、硬件设计 二、设计功能 三、Proteus仿真图 四、程序源码 资料包括: 需要完整的资料可以点击下面的名片加下我,找我要资源压缩包的百度网盘下载地址及提取码。 方案选择 单片机的选择 方案一&a…

回归预测 | MATLAB实现基于PSO-LSSVM-Adaboost粒子群算法优化最小二乘支持向量机结合AdaBoost多输入单输出回归预测

回归预测 | MATLAB实现基于PSO-LSSVM-Adaboost粒子群算法优化最小二乘支持向量机结合AdaBoost多输入单输出回归预测 目录 回归预测 | MATLAB实现基于PSO-LSSVM-Adaboost粒子群算法优化最小二乘支持向量机结合AdaBoost多输入单输出回归预测预测效果基本介绍模型描述程序设计参考…

MySQL8安装和删除教程 保姆级(Windows)

下载 官网: mysql官网点击Downloads->MySQL Community(GPL) Downloads->MySQL Community Server(或者点击MySQL installer for Windows) Windows下有两种安装方式 在线安装 一般带有 web字样 这个需要联网离线安装 一般没有web字样 安装 下载好之后,版本号可以不一样&…

Web 自动化测试学会这一招,下班至少早一小时

♥ 前 言 大家都知道,我们在通过 Selenium 执行 Web 自动化测试时,每次都需要启动/关闭浏览器,如果是多线程执行还会同时打开多个,比较影响工作的正常进行。那有没有办法可以不用让浏览器的自动化执行干扰我们的工作呢&#xf…

graphab 教程 ——生成廊道

Graphab软件包括图谱创建、基于图谱的连通性计算、分析与推广、制图四个模块。Graphab软件的图谱创建基于栅格数据进行,包括斑块识别和连接建立两个步骤。Graphab 软件可识别的栅格数据格式包括TIFF、ASCI和RST,栅格像元记录数值用于识别斑块类型,识别规则可以选择四邻域或八邻…

B100-技能提升-线程池分布式锁

目录 线程池什么是线程池?为什么用线程池?线程池原理常见四种线程池和自定义线程池 线程池 什么是线程池? 池化技术 为什么用线程池? 1 由于设置最大线程数,防止线程过多而导致系统崩溃。 2 线程复用,不需要频繁创建或销毁…

WebAPIs 第三天

DOM 事件进阶 事件流事件委托其他事件元素尺寸与位置 一.事件流 事件流与两个阶段说明事件捕获事件冒泡阻止冒泡解绑事件 1.1 事件流与两个阶段说明 ① 事件流:指的是事件完整执行过程中的流动路径 ② 事件流分为捕获阶段和冒泡阶段 1.2 事件捕获 从DOM根元素…

opsForHash() 与 opsForValue 请问有什么区别?

&#x1f449;&#xff1a;&#x1f517;官方API参考手册 如图&#xff0c;opsForHash()返回HashOperations<K,HK,HV>但是 opsForValue()返回ValueOperations<K,V>… 区别就是opsForHash的返回值泛型中有K,HK,HV,其中K是Redis指定的某个数据库里面某一个关键字(由…

三分钟带你快速掌握MongoDB数据库和集合基础操作

文章目录 前言一、案例需求二、数据库操作1. 选择和创建数据库2. 数据库的删除 三、集合操作1. 集合的显式创建&#xff08;了解&#xff09;2. 集合的隐式创建3. 集合的删除 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便…

太牛了!国内版ChatDoc企业知识库,直接操作Doc、Docx、PDF、txt等文件

自ChatGPT问世以来&#xff0c;国外就有ChatPDF、ChatDOC等基于文档问答的项目&#xff0c;但是国内还一直处于对话类产品的研发中。 贵州猿创科技研发了基于本地向量模型的ChatDoc知识库系统&#xff0c;可以直接上传Doc、Docx、PDF、txt、网页链接等进行问答。 体验地址&…

【算法篇C++实现】常见查找算法

文章目录 &#x1f680;一、预备知识⛳&#xff08;一&#xff09;查找的定义⛳&#xff08;二&#xff09;数组和索引 &#x1f680;二、二分查找&#x1f680;三、穷举搜索&#x1f680;四、并行搜索⛳&#xff08;一&#xff09;并发的基本概念⛳&#xff08;二&#xff09;…