shell交互脚本,告别case与select菜单的实现
创作背景
目前大多数的一键脚本都是通过case或者是select语句对脚本中相关的功能进行列出,根据用户的输入在调用具体的方法体执行。但是往往面临一个问题就是当脚本的功能多起来或者是逻辑复杂后,脚本中关于交互的代码会变得不易维护和拓展。
而且渐渐的我们会发现为了制作一键脚本,但是codeing的时间都花在了脚本交互上,时间久了容易产生错觉shell的研发就是在写交互。auxt-shell在开始研发时也面临着这样一个问题,而且我们发现linux上大多数的大多数操作都已经有相关的脚本了,auxt-shell上在编写一遍属于重复轮子。因此更多的我们是把当前shell研发处在的问题点抽象出来,并给出对应的解决方案形成shell研发的基础支撑。
功能实现展示
本次讲解的是不通过case和select语句实现shell的菜单交互,并且可以不侵入用户的业务脚本,脚本功能扩展时可以很平滑的实现菜单扩展。
通过auxt-shell项目实现脚本交互的代码
#!/bin/bash
########################公共文件引入######################
source ../base/auxt-base.sh
########################菜单列表配置区###################
###注意:功能名称与方法名称必须在数组中下标一一对应
dockerMenu=("Docker安装" "Docker仓库配置" "Docker卸载")
dockerFunction=(docker-install docker-hubset docker-uninstall)
###################脚本功能执行入口###############
###文件基本简介
echo && echo -e "${Info}Docker维护工具"
#菜单实现
auxtMenu "${dockerMenu[*]}"
#功能执行
${dockerFunction[$?]}
从上面的代码可以看出实现一个功能菜单只需要最简单的只需要5行代码即可。而当脚本的功能进行扩充的时,我们也只需要调整菜单列表配置区的数组内容即可。其他不需要进行任何修改。并且auxt-shell项目的菜单功能还实现了开发者项目信息声明和脚本退出功能支持。
3、auxt-shell项目菜单公共方法实现核心代码展示
##版权声明
echo && echo -e "auxt-shell自动化运维管理脚本 ${Green_font_prefix}[${sh_version}]${Font_color_suffix}-- XyzBeta | https://github.com/xyzbeta/auxt-shell --"
##菜单实现
function auxtMenu(){
#传参接收区,注意数组变量赋值给其它变量需要使用括号。
local menuArry=($1)
until [[ "0" == ${num} ]]
do
echo
local i=0
while [ $i -lt ${#menuArry[@]} ]
do
echo -e "\t${Green_font_prefix}$((i+1)).${Font_color_suffix}${menuArry[i]}"
let i++
done
echo -e "\t${Green_font_prefix}0.${Font_color_suffix}退出"
echo && read -p "请输入数字[0-${#menuArry[@]}]:" num && echo
if [[ "0" == ${num} ]]; then
echo -e "${Info}执行退出命令." && echo
exit 0;
elif [[ "1" -le ${num} && ${num} -le ${#menuArry[@]} ]]; then
return $((num-1))
break
else
echo -e "${Tip}参数输入错误."
fi
done
}
auxt-shell项目的菜单公共方法核心实现思路为,调用菜单方法传入一个菜单列表数组,方法根据数组的内容循环输出,并根据用户的选择返回数组下标到业务脚本,业务脚本根据下标定位数组二中的方法进行执行即可。
其它说明
本文章只是auxt-shell项目中公共核心文件的菜单方法说明,了解和使用更多关于auxt-shell项目,你可以访问https://www.xyzbeta.com/81
本文系作者 @Mr.Lee 原创发布在 维简网。未经许可,禁止转载。