#!/bin/bashcat file1 | while read LINEdo echo "this is $LINE" ssh -lroot -p22 192.168.10.169 "df -h"done
上述脚本期望实现的功能是:读取一个有多行内容的文件file1,每打印一行之后就用ssh远程执行显示远程主机的磁盘分区使用情况。
实际执行结果:只打印了第一行和执行了一次ssh命令,脚本就退出了。
案例原因解析:while中使用重定向机制,file1文件中的信息都已经读入并重定向给了整个while语句,所以当我们在while循环中再一次调用read语句,就会读取到下一条记录,但是,因为ssh会读取存在的缓存,调用完ssh语句后,输入缓存中已经都被读完了,当read语句再读的时候当然也就读不到纪录,循环也就退出了。
解决方法:对ssh使用输入重定向,而防止它去读while的缓存,或者使用for循环避免使用重定向的方式。代码如下:
#!/bin/bash#cat file1 | while read LINEdo echo "this is $LINE" ssh -lroot -p22 192.168.10.169 "df -h" < /dev/nulldone
#!/bin/bash#for LINE in `cat file1`do echo "this is $LINE" ssh -lroot -p22 192.168.10.169 "df -h"done