您的位置:首页 > 运维架构 > Shell

Shell :文件读取 只读取第一行后 莫名退出的问题

2011-10-14 15:30 141 查看
Shell :文件读取 只读取第一行后 莫名退出的问题
这2天有个需求,就是到很多台服务器的日志上去查找某个字符串,所以我就写了个脚本:

#!/bin/bash

testNum=3

declare -a ips

ips[0]=10.22.16.202

ips[1]=10.12.16.203

ips[2]=10.22.16.204

if [ $# != 1 ]; then

echo "please input find file "

else

FINDFILE=$1

fi

while read LINE

echo $ LINE

i=0

while [ $i -lt $testNum ]

do

echo ${ips[$i]}

echo $ LINE

ssh -oPort=20 ${ips[$i]} "cd /data/test/testPath;grep '$ LINE *.txt"

ssh -oPort=20 ${ips[$i]} "cd /data2/test/testPath;grep '$ LINE *.txt"

i=$(($i+1))

done

done < $FINDFILE

由于是要查找很多字符串,所以我就把串放到了一个文件里面,通过读取文件,到各个服务器上去查找,但是每次都是读取第一行就退出了 读取文件的while循环,非常苦恼。尝试把内层while循环去掉,可以正常读取。

把 ssh那2行去掉也可以正常读取。

后来上网找了找,才找到答案,参考了这个帖子:

http://bbs.chinaunix.net/viewthread.php?tid=769040&extra=&page=3

把 脚本改成这样就可以了:

#!/bin/bash

testNum=3

declare -a ips

ips[0]=10.22.16.202

ips[1]=10.12.16.203

ips[2]=10.22.16.204

if [ $# != 1 ]; then

echo "please input find file "

else

FINDFILE=$1

fi

exec 3<FINDFILE

while read LINE <&3

echo $ LINE

i=0

while [ $i -lt $testNum ]

do

echo ${ips[$i]}

echo $ LINE

ssh -oPort=20 ${ips[$i]} "cd /data/test/testPath;grep '$ LINE *.txt"

ssh -oPort=20 ${ips[$i]} "cd /data2/test/testPath;grep '$ LINE *.txt"

i=$(($i+1))

done

done

解释如下:

问题的关键在于:

read从输入读取了一行内容后,

其它的程序(比如 rsh或sed)从同样的地方把其它的输入读走了,

read当然读不到其它内容了,

while也就结束了

改成

exec 3<urfile

while read var <&3

do

....

done

这种模式就可以了。

原来的情况是 FD1 ===>read FD1 ===>sed

后来的情况是 FD3 ===>read FD1 ===>sed
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: