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

省流:shift关键字

探索思路

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

bash 复制代码
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

伪代码大概如下:

shell 复制代码
## 如果是 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就可以了,更改后的脚本如下:

shell 复制代码
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,后面的内容就会一一对应起来了。

简单验证

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

shell 复制代码
#!/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 启动脚本

相关推荐
挥剑决浮云 -12 分钟前
Linux 之 安装软件、GCC编译器、Linux 操作系统基础
linux·服务器·c语言·c++·经验分享·笔记
小O_好好学1 小时前
CentOS 7文件系统
linux·运维·centos
x晕x2 小时前
Linux dlsym符号查找疑惑分析
linux·运维·服务器
活跃的煤矿打工人2 小时前
【星海saul随笔】Ubuntu基础知识
linux·运维·ubuntu
fasewer3 小时前
第五章 linux实战-挖矿 二
linux·运维·服务器
楚灵魈4 小时前
[Linux]从零开始的网站搭建教程
linux·运维·服务器
小小不董4 小时前
《Linux从小白到高手》理论篇:深入理解Linux的网络管理
linux·运维·服务器·数据库·php·dba
这可就有点麻烦了4 小时前
强化学习笔记之【TD3算法】
linux·笔记·算法·机器学习
DY009J4 小时前
深度探索Kali Linux的精髓与实践应用
linux·运维·服务器
程序员-珍5 小时前
虚拟机ip突然看不了了
linux·网络·网络协议·tcp/ip·centos