for与while循环读行及嵌套ssh的区别

原创 2011年01月25日 11:07:00

  有个需求:有三列信息文本,第一列IP,第二列用途,第三列备注,需要登录每个IP执行命令,不符合执行命令结果的,打印出文本中这一行信息。
   需求很简单,只要用一个循环,能逐一登录到每台机器,执行命令就可以了,刚开始以为只要5分钟就能搞定的事情,结果花费了我一个上午的时间。主要耽搁在while循环里面嵌套了ssh。
   首先说说for跟while读行的区别,如都只有一列,结果是一样的,但是如果多列,比如txt内容这样:
line1 line2  line2
line4  line5  line6
用for循环:
for line in `cat txt`;
do echo $line;
done
显示的结果:
line1
line2
lien3
line4
line5
line6
用while循环:
cat txt|while read line;
do echo $line;
done
显示的结果:

line1 line2  line2
line4  line5  line6
   因此我的需求能用while来做,脚本如下:
cat txt|while read line
do
IP=`echo $line|awk '{print $1}'`
ssh -o ConnectTimeout=10 ${IP} "ls -l /home/admin|grep /"keyword/""
    if [ ! $? == "0" ];then
        echo "$line"
     fi
done
   但是问题来了,执行后,只做了一行就结束了,刚开始还怀疑难道是if判断有问题,一个if结束就退出来了,于是在脚本的每一步都加了调试信息,结果很快发 现并不是if结束就退出来了。于是就逐个注释掉调试,发现把ssh这句注释了就能继续下去,难道ssh哪里写错了?原因不是这样的。后来在网上查了资料, 发现这么一句话:while中使用重定向机制。也就是说一开始做while循环,txt全部内容已经被重定向给while循环,而ssh语句正好会读取输入中的所有东西。于是自己调试一下:
   
  cat txt|while read line
do
IP=`echo $line|awk '{print $1}'`
ssh ${IP} "cat"
done
  显示结果:
line4  line5  line6
也就是是说,最后一行已经读完了,循环也就结束了。
解决办法:将ssh的输入重定向输入。
 
cat txt|while read line
do
IP=`echo $line|awk '{print $1}'`
ssh -o ConnectTimeout=10 ${IP} "ls -l /home/admin|grep /"keyword/"" </dev/null
    if [ ! $? == "0" ];then
        echo "$line"
     fi
done
ssh最后加上  </dev/null 问题解决。
转载自:http://fengshihua.cublog.cn

shell下在while循环中使用ssh命令的问题

最近遇到一个很奇怪的问题,产品的某个功能可以根据日志文件的异常纪录,去处理这些异常,不过在测试的时候发现每次都只能处理一条异常,然后整个循环就退出了。 开始以为是某个函数里面调用了exit命令,看了一...
  • mgxcool
  • mgxcool
  • 2015年07月29日 22:54
  • 2599

shell脚本,在循环体中执行ssh命令的问题

cat ./file.txt | grep -v "^#" | while read IP IQ do ssh tomcat@$IP ... .. done 上述代码,当file....
  • eclipse_c
  • eclipse_c
  • 2016年07月14日 19:11
  • 1269

Linux之Shell脚本while循环ssh登录执行命令

包含以下内容
  • cloud952788
  • cloud952788
  • 2014年09月28日 13:26
  • 1319

for循环的两种实现方式

用法2: 用法解释,首先writename 是一个list类型的变量,现在要对其进行遍历(为空的话自然不会运行), 其包含三个String类型的变量,这也是需要遍...
  • bestcxx
  • bestcxx
  • 2016年05月12日 09:51
  • 598

ssh-循环显示数组或者list

循环显示数组或者list,value代表list名称,id代表当前迭代的元素, ...
  • u013217071
  • u013217071
  • 2016年11月30日 11:23
  • 311

for 循环嵌套 while 的神奇问题

在Xcode7中写了一段OC代码,在一个for循环中嵌套了一个while循环。因为for循环中有一个异步执行,我想等异步执行完,再执行下一个for循环,所以用while循环做了一个等待。 代码如下:...
  • OliveLao
  • OliveLao
  • 2016年03月31日 23:02
  • 1659

for 循环和while循环区别

do-while循环 while循环 for循环 死循环选择for还是while  C语言提供了好几种循环结构,即while、for和do-while。汇编语言中并没有相应的指令存在,作为替代,将条件...
  • XscKernel
  • XscKernel
  • 2015年11月11日 15:59
  • 3545

for与while循环读行及嵌套ssh的区别

  有个需求:有三列信息文本,第一列IP,第二列用途,第三列备注,需要登录每个IP执行命令,不符合执行命令结果的,打印出文本中这一行信息。    需求很简单,只要用一个循环,能逐一登录到每台...
  • zlpdaisy
  • zlpdaisy
  • 2011年01月25日 11:07
  • 1711

在ssh2整合中,for循环如何控制事务?在线,急

在ssh2整合中,for循环如何控制事务?在线,急 10 for(int i=0;i { 循环写入数据库 } 如何只要一条记录插入不成功,则全部不成功??? 遇见是一场 | 浏览 ...
  • evilcry2012
  • evilcry2012
  • 2017年10月18日 09:04
  • 50

循环结构(for循环和while循环的区别)

使用区别:控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原因是for循环结束,该变量就...
  • hurricane2016
  • hurricane2016
  • 2016年10月19日 15:32
  • 1427
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:for与while循环读行及嵌套ssh的区别
举报原因:
原因补充:

(最多只允许输入30个字)