config done shell_shell do...done $config
因?yàn)樽詈笥休斎胫囟ㄏ蚍?hào)
需要注意的是,config.ini文件中的標(biāo)題行也會(huì)被讀入。
man read,說(shuō)明中可以看到,如果讀成功的話,read返回讀取的字節(jié)數(shù);讀到文件的末尾則返回0。而對(duì)于while來(lái)講,條件為0表示為false,則退出循環(huán)。
有個(gè)需求:有三列信息文本,第一列IP,第二列用途,第三列備注,需要登錄每個(gè)IP執(zhí)行命令,不符合執(zhí)行命令結(jié)果的,打印出文本中這一行信息。
需求很簡(jiǎn)單,只要用一個(gè)循環(huán),能逐一登錄到每臺(tái)機(jī)器,執(zhí)行命令就可以了,剛開(kāi)始以為只要5分鐘就能搞定的事情,結(jié)果花費(fèi)了我一個(gè)上午的時(shí)間。主要耽擱在while循環(huán)里面嵌套了ssh。
首先說(shuō)說(shuō)for跟while讀行的區(qū)別,如都只有一列,結(jié)果是一樣的,但是如果多列,比如txt內(nèi)容這樣:
line1 line2 ?line2
line4 ?line5 ?line6
用for循環(huán):
for line in `cat txt`;
do echo $line;
done
顯示的結(jié)果:
line1
line2
lien3
line4
line5
line6
用while循環(huán):
cat txt|while read line;
do echo $line;
done
顯示的結(jié)果:
line1 line2 ?line2
line4 ?line5 ?line6
因此我的需求能用while來(lái)做,腳本如下:
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
但是問(wèn)題來(lái)了,執(zhí)行后,只做了一行就結(jié)束了,剛開(kāi)始還懷疑難道是if判斷有問(wèn)題,一個(gè)if結(jié)束就退出來(lái)了,于是在腳本的每一步都加了調(diào)試信息,結(jié)果很快發(fā) 現(xiàn)并不是if結(jié)束就退出來(lái)了。于是就逐個(gè)注釋掉調(diào)試,發(fā)現(xiàn)把ssh這句注釋了就能繼續(xù)下去,難道ssh哪里寫錯(cuò)了?原因不是這樣的。后來(lái)在網(wǎng)上查了資料, 發(fā)現(xiàn)這么一句話:while中使用重定向機(jī)制。也就是說(shuō)一開(kāi)始做while循環(huán),txt全部?jī)?nèi)容已經(jīng)被重定向給while循環(huán),而ssh語(yǔ)句正好會(huì)讀取輸入中的所有東西。于是自己調(diào)試一下:
cat txt|while read line
do
IP=`echo $line|awk '{print $1}'`
ssh ${IP} "cat"
done
顯示結(jié)果:
line4 ?line5 ?line6
也就是是說(shuō),最后一行已經(jīng)讀完了,循環(huán)也就結(jié)束了。
解決辦法:將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
總結(jié)
以上是生活随笔為你收集整理的config done shell_shell do...done $config的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: caffe检测图片是否包含人脸_caff
- 下一篇: 51单片机的复位引脚_51单片机复位电路