分享

Good example of one shell script(转自zhangjoto)

 恶之一眉 2012-01-05
很久没进shell论坛了,不小心发现这个贴子,也来一个。
脚本写多了可能自己都记不住什么事情用什么脚本搞定。下面是用于将所有各式各样的零散脚本集中到一个菜单里的脚本,支持N级子菜单:
  1. prog=`basename $0`

  2. if [ $# -lt 1 ]; then
  3.     echo "Useage:  $prog cfgfile"
  4.     echo "Example: $prog list"
  5.     exit 1
  6. fi

  7. awk -F":" -v file=$1 '
  8.         function genarr() {
  9.                 while ((getline < file) > 0) {
  10.                         a_lev = gsub("\t", "", $1);
  11.                         if (a_plev >= a_lev) {
  12.                                 a_suf[a_lev] += 1;
  13.                         } else {
  14.                                 a_suf[a_lev] = 1;
  15.                         }
  16.                         a_plev = a_lev;
  17.                         path[a_lev] = path[a_lev - 1]", "a_suf[a_lev];
  18.                         gItm[path[a_lev]] = $1;
  19.                         gCmd[path[a_lev]] = $2;
  20.                 }
  21.         }

  22.         function title() {
  23.                 print "    Test My Menu";
  24.         }

  25.         function selitm(sItmNo) {
  26.                 if ($0 == "q") {
  27.                         exit 0;
  28.                 }
  29.                 if ($0 < "0" || $0 > sItmNo) {
  30.                         printf "Input number(0-%d):", sItmNo;
  31.                         return 1;
  32.                 }
  33.                 if ($0 == sItmNo) {
  34.                         if (gPath == "") {
  35.                                 exit 0;
  36.                         }
  37.                         match(gPath, ", *[0-9]+$");
  38.                         gPath = substr(gPath, 1, RSTART - 1);
  39.                 }
  40.                 return 0;
  41.         }

  42.         function menu(mPath) {
  43.                 mItmNo = 1;
  44.                 system("clear");
  45.                 title();
  46.                 while (gItm[mPath", "mItmNo]) {
  47.                         printf "    %d. %s\n", mItmNo, gItm[mPath", "mItmNo];
  48.                         mItmNo ++;
  49.                 }
  50.                 printf "    %d. Return\n", mItmNo;
  51.                 printf "Input number(0-%d):", mItmNo;
  52.                 return mItmNo;
  53.         }

  54.         BEGIN {
  55.                 gPath = "";
  56.                 genarr();
  57.                 itmNo = menu(gPath);
  58.         }

  59.         {
  60.                 if (selitm(itmNo) != "0") {
  61.                         next;
  62.                 };
  63.                 tPath = gPath", "$0;
  64.                 if (gCmd[tPath]) {
  65.                         system(gCmd[tPath]);
  66.                 } else if ($0 != itmNo) {
  67.                         gPath = tPath;
  68.                 }
  69.                 itmNo = menu(gPath);
  70.         }
  71. ' -
复制代码
执行时的第一个参数为定义菜单结构的文本文件,样例如下:
  1. 导出数据
  2.         导出全国中心:echo "导出全国中心"
  3.         导出前置:echo "导出前置"
  4. 导入数据
  5.         导入全国中心:echo "导入全国中心"
  6.         导入前置:echo "导入前置"
  7.         检查
  8.                 检查:. local.run luxqq
  9. 移植: echo "check"
复制代码
每个子菜单以tab缩进,菜单项与要执行的命令之间以冒号分隔即可。
完成功能后没做什么优化,欢迎大家指教。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多