while read line 与for循环的区别
例子:要从一个ip列表中获取ip、port,然后ssh ip 到目标机器进行特定的command操作ssh -o StrictHostKeyChecking=no -p22 ip "ls -la /data/"ip列表:115.159.93 1 22115.159.94.2 22115.159.94.3 22115.159.94.4 22编写脚本时使用while read line逐行读取ip列表,然而出现了这个问题,在while循环中只读取第一个ip执行了command后就退出了脚本,而没有继续往下循环执行
这里就要解析一下while read line 与for循环的区别了while read line 是一次性将信息读入并赋值给line ,而for是每次读取一个以空格为分割符的字符串。while中使用重定向机制,ip列表中的所有信息都被读入并重定向给了整个while语句中的line变量。所以当我们在while循环中再一次调用read语句,就会读取到下一条记录。问题就出在这里,$line中的最后一行已经读完,无法获取下一行记录,从而退出while循环。解决方法:
1、ssh加上-n参数ssh -n -o StrictHostKeyChecking=no -p22 ip "ls -la /data/"2、将ssh的输入重定向输入ssh -o StrictHostKeyChecking=no -p22 ip "ls -la /data/" < /dev/null