- 论坛徽章:
- 0
|
很久没进shell论坛了,不小心发现这个贴子,也来一个。
脚本写多了可能自己都记不住什么事情用什么脚本搞定。下面是用于将所有各式各样的零散脚本集中到一个菜单里的脚本,支持N级子菜单:
- prog=`basename $0`
- if [ $# -lt 1 ]; then
- echo "Useage: $prog cfgfile"
- echo "Example: $prog list"
- exit 1
- fi
- awk -F":" -v file=$1 '
- function genarr() {
- while ((getline < file) > 0) {
- a_lev = gsub("\t", "", $1);
- if (a_plev >= a_lev) {
- a_suf[a_lev] += 1;
- } else {
- a_suf[a_lev] = 1;
- }
- a_plev = a_lev;
- path[a_lev] = path[a_lev - 1]", "a_suf[a_lev];
- gItm[path[a_lev]] = $1;
- gCmd[path[a_lev]] = $2;
- }
- }
- function title() {
- print " Test My Menu";
- }
- function selitm(sItmNo) {
- if ($0 == "q") {
- exit 0;
- }
- if ($0 < "0" || $0 > sItmNo) {
- printf "Input number(0-%d):", sItmNo;
- return 1;
- }
- if ($0 == sItmNo) {
- if (gPath == "") {
- exit 0;
- }
- match(gPath, ", *[0-9]+$");
- gPath = substr(gPath, 1, RSTART - 1);
- }
- return 0;
- }
- function menu(mPath) {
- mItmNo = 1;
- system("clear");
- title();
- while (gItm[mPath", "mItmNo]) {
- printf " %d. %s\n", mItmNo, gItm[mPath", "mItmNo];
- mItmNo ++;
- }
- printf " %d. Return\n", mItmNo;
- printf "Input number(0-%d):", mItmNo;
- return mItmNo;
- }
- BEGIN {
- gPath = "";
- genarr();
- itmNo = menu(gPath);
- }
- {
- if (selitm(itmNo) != "0") {
- next;
- };
- tPath = gPath", "$0;
- if (gCmd[tPath]) {
- system(gCmd[tPath]);
- } else if ($0 != itmNo) {
- gPath = tPath;
- }
- itmNo = menu(gPath);
- }
- ' -
复制代码 执行时的第一个参数为定义菜单结构的文本文件,样例如下:
- 导出数据
- 导出全国中心:echo "导出全国中心"
- 导出前置:echo "导出前置"
- 导入数据
- 导入全国中心:echo "导入全国中心"
- 导入前置:echo "导入前置"
- 检查
- 检查:. local.run luxqq
- 移植: echo "check"
复制代码 每个子菜单以tab缩进,菜单项与要执行的命令之间以冒号分隔即可。
完成功能后没做什么优化,欢迎大家指教。 |
|