中原郑州网站建设,如何能把网站做的更大,wordpress全站广告位,100%能上热门的短视频素材省流#xff1a;shift关键字 探索思路
最近有一个小小的需求#xff0c;写一个类似于docker run -a -b -c这样的脚本#xff0c;这个脚本名为doline#xff0c;它本身可以执行#xff08;doline -a -b -c#xff09;#xff0c;同时又带有几个如run、init、start这样的… 省流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 启动脚本