config done shell_shell do...done < $config

因为最后有输入重定向符号

需要注意的是,config.ini文件中的标题行也会被读入。

man read,说明中可以看到,如果读成功的话,read返回读取的字节数;读到文件的末尾则返回0。而对于while来讲,条件为0表示为false,则退出循环。

有个需求:有三列信息文本,第一列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/""

if [ ! $? == "0" ];then

echo "$line"

fi

done

ssh最后加上

while read line

do

ehco "hello"

done < file

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值