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
#!/bin/bash
ls -l
while true
do
echo "返回请按 q ,刷新请按 r "
read ans1
for aa in $ans1
do
case $aa in
q)
break 2
;;
r)
ls -l
continue
;;
esac
done
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比较好
while true
do
if [ "$ans" != "r" ]
then
RunMenu
read menu
fi
clear;echo;echo
case $menu in
1)
/usr/symcli/bin/symmir -sid 24 -f /dev/xxx.map query
;;
2)
lsvg -o
;;
3)
varyonvg vg1
varyonvg vg2
;;
4)
start
;;
5)
stop
;;
6)
varyoffvg vg1
varyoffvg vg2
;;
0)
exit 0
;;
*)
continue
;;
esac
echo "返回请按任意键,刷新请按'r': \c"
read ans
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