免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4838 | 回复: 6
打印 上一主题 下一主题

while嵌套循环的不解之处,请教各位点一下 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-24 23:32 |只看该作者 |倒序浏览
while read cmd1
do
。。。。
。。。。
。。。。
  while read cmd2
  do
    ...
  done < cmd2.txt
。。。。
。。。。
。。。。

done < cmd1.txt

这个嵌套中cmd1只执行一次,但是cmd1.txt 有多个行,cmd2可以执行完。
如果单独执行cmd1也可以执行完,但就是嵌套不行。我的是SunOS操作系统,ksh的。
请问还要怎么做才能真正执行呢?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2006-07-25 00:28 |只看该作者
看不懂~,举个实例吧

论坛徽章:
0
3 [报告]
发表于 2006-07-25 02:57 |只看该作者
试一试这样:

exec 7<cmd1.txt
while read -u7;do
    ...
    exec 6<cmd2.txt
    while read -u6;do
        ...
    done
    exec 6>&-
done
exec 7>&-

[ 本帖最后由 wwy 于 2006-7-25 03:00 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-07-25 09:56 |只看该作者
谢谢各位解答,我说的太简略了,我就举个例子吧:
while read wb_ip; #在param里得到第一个交换机的ip地址个密码
do

##
ip=`cat param |grep "$wb_ip" |awk '{ print $1 }'`
inp1=`cat param |grep "$wb_ip" |awk '{ print $2 }'`
inp2=`cat param |grep "$wb_ip" |awk '{ print $3 }'`

inputfile=in
outputfile=out

rm -fr $inputfile
rm -fr $outputfile
mknod $inputfile p
touch $outputfile

#file description 7 for out and 8 for in
exec 7<>$outputfile
exec 8<>$inputfile

telnet $ip <&8 >&7 &

sleep 1; echo $inp1 >> $inputfile

tail -f $outputfile &
                       
sleep 1; echo su >> $inputfile
sleep 1; echo $inp2 >> $inputfile
sleep 1; echo sys >>$inputfile

while read cmd;  #开始执行循环得到某个交换机的命令
do
sleep 1; echo $cmd >> $inputfile;
done < $ip

sleep 1; echo quit >> $inputfile;
sleep 1; echo quit >> $inputfile;
sleep 1; echo quit >> $inputfile;
sleep 1; exit
##

done <param

我的目的是telnet到各个交换机上执行命令后退出.

以上代码除了外层的while read wb_ip循环,里面的代码(两个##之间)都可以正确执行,
(这段代码其实就是各位高手提供的利用管道等技术实现自动telnet)
但是加上外层循环
while read wb_ip;
do

done <param
只执行一次.

这个外层代码是执行各个交换机的循环. 是不是里面的代码影响的?
----------------------------------------------------------------
以下为参数文件: param.txt存的是交换机的 ip地址和密码.
其他为各个交换机的命令参数文件(实际有20多个交换机).
############# param.txt ###############
10.10.10.1 passwd1 passwd2
10.10.10.2 passwd1 passwd2
10.10.10.3 passwd1 passwd2
....
....
#######################################


############# 10.10.10.1#################
sh run
sh proc cpu
sh proc mem
....
....
##############################################

############# 10.10.10.2#################
dis cu
dis proc cpu
dis proc mem
....
....
##############################################

############# 10.10.10.3#################
sh mod
sh port
sh int vlan
....
....
##############################################

论坛徽章:
0
5 [报告]
发表于 2006-07-25 10:01 |只看该作者
为什么要这样复杂???
为什么不优化一下编程思路?
比如结构化、函数?
简单才是美,写复杂让别人看不懂是小,自己执行错误系统宕机是大

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
6 [报告]
发表于 2006-07-25 10:16 |只看该作者
内部的循环放到子shell中执行试试:
while read cmd1
do
。。。。
。。。。
。。。。
  (
  while read cmd2
  do
    ...
  done < cmd2.txt
  )
。。。。
。。。。
。。。。

done < cmd1.txt

论坛徽章:
0
7 [报告]
发表于 2006-07-25 10:36 |只看该作者
原帖由 zj0953 于 2006-7-25 10:01 发表
为什么要这样复杂???
为什么不优化一下编程思路?
比如结构化、函数?
简单才是美,写复杂让别人看不懂是小,自己执行错误系统宕机是大



呵呵,是的,可能是看着复杂了,简单的说可能是交换机太多了,一个交换机容易对付,多了就想着存成几个命令文件依次执行。
我也是想简单点的呀。 
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP