携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情
之前,正在上手的小模块需要打 jar 包放到服务器上。这个模块之前是提供过一个启动的 shell 脚本的,但后来老大为了方便操作,提出了一些需求,需要在原来的 shell 脚本基础上进行修改,正好借着机会熟悉了一下 shell 脚本的编写。
需求:支持在启动命令后面直接输 jar 包版本名
这个要求,我认为提的还算比较合理,给的理由是 lib 路径下存放的 jar 包都不怎么会删除,以免新版本 jar 包出问题后能够直接在命令行后面指定 jar 包版本。之前的脚本代码中,关于 jar 包的使用是这样写的:
nohup java $JAVA_OPT -Deserver_name=XXX -cp ./conf:lib/* org.springframework.boot.loader.JarLauncher &> /dev/null 2>&1 &
关键就是其中的lib/*,它的意思就是使用位于 lib 目录下的所有 jar 包,而以前每次有新的 jar 包放进去的时候,都会把旧的删掉,所以 lib 目录下总是只有一个 jar 包。
我接下来要做的,就是想办法把这里改成可以读命令行输入的参数的形式。
一开始我还想错了,我首先想到了直接在 shell 脚本中把位于 lib 目录下,时间最新的 jar 包给用上。获取 lib 目录下时间最新的文件的命令为:
ls -lt ./lib/ | grep XXX(文件名简写) | head -1
但是,当我把这行加进去之后,怎么都应用不成功,折磨半天没搞明白。我想着命令也没问题啊,我敲命令都还运行出来结果了,确实找到了最新的文件。后来问了一位前辈,看了我的脚本后,找到了问题。
上述命令,确实能够找到最新的文件名,但这个文件名很长,是全文件名,如下图
总之就很长,而脚本中在启动 Java 程序时,需要的 jar 包文件名只是关键的包名称,所以还要截一下,于是就变成了:
ls -lt ./lib/ | grep XXX(文件名简写) | head -1 | awk '{print $9}'
只截取第九列的值,就是 jar 包的文件名。然后试了一下,如果直接执行启动脚本,确实可以应用 lib 目录下的最新的 jar 包。
但是,要求是能够在启动脚本后面直接跟上 jar 包版本,直接应用输入的版本的 jar 包,不一定是最新的。想了一下之后,其实改起来也很简单,因为 shell 脚本对于命令行上输的参数有很方便的接收,根据在命令行中输入的参数个数,通过$1、$2、$3....$9可以很方便的取到第一个、第二个、第三个....第九个参数。而之前的脚本中已经接收了命令行中输入的第一个参数,也就是start、stop、restart用于表示启动的类型,所以直接在脚本中用$2接收命令行中输入的 jar 包版本。
接收到后,逻辑也很简单,判断输入的参数$2是否为空,如果是空的,说明没有输入,则默认使用最新的,否则,就用$2,命令行中输入的 jar 版本。注意用一个中间变量接收。形如:
arg2 = $2
newJar = ""
getNewJar() {
if [ arg2 = "" ];
then
newJar = ls -lt ./lib/ | grep x2-monitor | head -1 | awk '{print $9}'
else
newJar = arg2
fi
}
......
getNewJar
nohup java $JAVA_OPT -Deserver_name=XXX -cp ./conf:./lib/${newJar} org.springframework.boot.loader.JarLauncher &> /dev/null 2>&1 &
一个启动脚本,算是让我对 shell 脚本更加熟悉了,文中所提到的脚本代码都是已经实验过的,应该没什么错误。如果其他地方有问题,望指正。
我向你敬礼啊,Salute!