Chinaunix

标题: 有关循环体使用的问题,请教 [打印本页]

作者: 展天    时间: 2007-12-20 18:34
标题: 有关循环体使用的问题,请教
有个KSH脚本,内容如下:

    ls -l
    echo "返回请按 " q ",刷新请按" r " : \c"
     while  read ans1
       do aa=$ans1
         if ["$aa"="q"]
          then
           break
         elif
         if ["$aa"="r"]
          then
          ?????
         fi
       done
      ;;

问题:如何在接收到键盘输入"r"时候,重新执行ls -l 这条呢?也就是在????处用什么方式使循环重新开始?
作者: seeLnd    时间: 2007-12-20 18:40
???? 处你写什么都行,只要不写break, 循环就会重新开始,
恩,呵呵   就写 ls -l 好了
作者: 展天    时间: 2007-12-20 19:39
呵呵,谢谢楼上兄弟的解答,不过也许,是我没有说清楚,这个shell是一个大循环中的分支循环,这个小循环顶部的命令是一条有回显的命令,我需要达到的目标是,回显内容后等待键盘输入,当接收到键盘输入“q”时,清屏退出这个小循环,回到上层大循环构架的目录中,当接收到键盘输入"r"时,重新执行这条命令并再次等待键盘输入。只是在这里用了一个同样有回显的命令替代了我实际需要执行的命令,呵呵。等待兄弟们给我提示……
作者: 展天    时间: 2007-12-21 11:39
顶一下
作者: sealearner    时间: 2007-12-21 13:58
改成这样应该就可以了吧
while true
do
ls -l
echo "返回请按 " q ",刷新请按" r " : \c"
read ans1
aa=$ans1
   if ["$aa"="q"]
          then
           break
    elif
         if ["$aa"="r"]
          then
          continue
         fi
       done

[ 本帖最后由 sealearner 于 2007-12-21 13:59 编辑 ]
作者: 我来似水    时间: 2007-12-21 14:50
提示: 作者被禁止或删除 内容自动屏蔽
作者: 展天    时间: 2007-12-21 17:05
谢谢sealearner,不过,依然不行
作者: seeLnd    时间: 2007-12-21 17:11
你把整个大结构用 伪代码整理一下吧,我想信是你没有描述清楚,论坛这么多高人,你的问题不会那么难的
作者: 展天    时间: 2007-12-21 20:44
谢谢楼上的兄弟,这样吧,我把目前成型的shell段落贴上来,请各位兄弟帮我指点指点,谢谢

#!/bin/ksh

#系统当前时间
  dt=`date +"%Y年%m月%d日"`
  tm=`date +"%H:%M:%S"`

#主菜单
RunMenu()
{
    clear
echo   "                                                             "
echo   "                                 管  理  菜  单            "
echo   "          =========================================================="
    echo   "                           "$dt"  "$tm"\n                      "
    echo   "                     ┌────────────────────────────────┐ "
    echo   "                     │                                │"
    echo   "                     │       1. 卷组当前状态          │"
    echo   "                     │       2. 数据卷组状态          │"
    echo   "                     │       3. 启用数据卷组          │"
    echo   "                     │       4. 启动应用程序          │"
    echo   "                     │       5. 停止应用程序          │"
    echo   "                     │       6. 停止数据卷组          │"
    echo   "                     │       0. 退出管理系统          │"
    echo   "                     │                               │"
    echo   "                     └────────────────────────────────┘"
    echo   "                              请选择:  \c "
}


while true
  do
    RunMenu
    read ans
     case $ans in

        1)
          clear
          echo ""
          echo ""
          /usr/symcli/bin/symmir -sid 24 -f /dev/xxx.map query
            echo "返回请按" q "键,刷新请按" r ": \c"
             while true
               do
                read ans1
                 case $ans1 in
                   q)
                     clear
                     break
                   ;;
                   r)
                     clear
                     continue
                 esac
           done
          ;;
        2)
          clear
          echo ""
          echo ""
          lsvg -o
            echo "返回请按" q "键: \c"
             while true
               do
                 read ans1
                  case $ans1 in
                    q)
                      clear
                      break
                  esac
               done
          ;;
        3)
          clear
          echo ""
          echo ""
            varyonvg vg1
            varyonvg vg2
            echo "返回请按" q "键: \c"
             while true
               do
                 read ans1
                  case $ans1 in
                    q)
                      clear
                      break
                  esac
               done
          ;;
        4)
          clear
          echo ""
          echo ""
            start
            echo "返回请按" q "键: \c"
             while true
               do
                 read ans1
                  case $ans1 in
                    q)
                      clear
                      break
                  esac
               done
          ;;
        5)
          clear
          echo ""
          echo ""
            stop
            echo "返回请按" q "键: \c"
             while true
               do
                 read ans1
                  case $ans1 in
                    q)
                      clear
                      break
                  esac
               done
          ;;
          6)
          clear
          echo ""
          echo ""
            varyoffvg vg1
            varyoffvg vg2
            echo "返回请按" q "键: \c"
             while true
               do
                 read ans1
                  case $ans1 in
                    q)
                      clear
                      break
                  esac
               done
          ;;
         0)
           exit 0
     esac
   done


目前,其他段落运行没有问题,问题就在" 1)"处,我想在" 1)"这个段落实现显示完成后等待键盘输入,接收到"q"值时,退回到顶层菜单,而接收到"r"值时,重新运行"1)"这个段落中的那个命令,再次显示并等待键盘输入.

等待兄弟们给予提示
作者: linux_paly    时间: 2007-12-21 21:06

  1. #!/bin/bash
  2. ls -l
  3. while true
  4. do
  5. echo "返回请按 q ,刷新请按 r "
  6. read ans1
  7. for aa in $ans1
  8. do
  9. case $aa in
  10. q)
  11. break 2
  12. ;;
  13. r)
  14. ls -l
  15. continue
  16. ;;

  17. esac
  18. done
  19. done
复制代码


5楼把if ["$aa"="r"]  if删掉就行了. 修改下.

[ 本帖最后由 linux_paly 于 2007-12-21 21:14 编辑 ]
作者: linux_paly    时间: 2007-12-21 21:22
标题: 回复 #9 展天 的帖子
1)
while true
do

把这写在这
作者: seeLnd    时间: 2007-12-21 21:59
/usr/symcli/bin/symmir -sid 24 -f /dev/xxx.map query
echo "返回请按" q "键,刷新请按" r ": \c"
while true
do
------------------- 变成 ------------------
while true
do
/usr/symcli/bin/symmir -sid 24 -f /dev/xxx.map query
echo "返回请按" q "键,刷新请按" r ": \c"
---------------------------------

BTW:  你的代码重复太多,很多相同功能的可以做成一个函数,
还有,也没有什么出错处理,与用户交互的程序出错处理是必要的,
呵呵,兄弟加油!
作者: seeLnd    时间: 2007-12-22 03:56
主要给你改了一下程序结构,没有太多写法变化,稍有点改变,但是主线逻辑是按照你的来写的
PS: 不同的部分才放到case中的分支,相同的都可以提取出来放到外部一并执行,
    还有像这种菜单选择类的用select比较好
  1. while true
  2. do
  3.     if [ "$ans" != "r" ]
  4.     then
  5.         RunMenu
  6.         read menu
  7.     fi

  8.     clear;echo;echo

  9.     case $menu in
  10.         1)
  11.             /usr/symcli/bin/symmir -sid 24 -f /dev/xxx.map query
  12.             ;;
  13.         2)
  14.             lsvg -o
  15.             ;;
  16.         3)
  17.             varyonvg vg1
  18.             varyonvg vg2
  19.             ;;
  20.         4)
  21.             start
  22.             ;;
  23.         5)
  24.             stop
  25.             ;;
  26.         6)
  27.             varyoffvg vg1
  28.             varyoffvg vg2
  29.             ;;
  30.         0)
  31.             exit 0
  32.             ;;
  33.         *)
  34.             continue
  35.             ;;
  36.     esac

  37.     echo "返回请按任意键,刷新请按'r': \c"
  38.     read ans
  39. done
复制代码

[ 本帖最后由 seeLnd 于 2007-12-22 04:01 编辑 ]
作者: 展天    时间: 2007-12-22 15:54
谢谢seeLnd兄弟的帮助,问题解决了,说实话,我平时很少写shell,就自己写过少量的系统管理方面的小工具,水平实在是很菜,看来以后要多研究学习这方面的内容了,以后还请多指教,同时也谢谢提供建议的各位兄弟,谢谢大家,谢谢

[ 本帖最后由 展天 于 2007-12-22 15:56 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2