总结一下while read line 与 for循环的区别(白话)

都是读取文件 while read line 以\n为分割符,而for是以空格为分隔符

补充一点就是:for会一行一行的读取,while read line会一次性读走 ssh遍历时很明显

还有一个需要注意的是从windos拿过来的文件默认行尾都是以\r结尾的,如果不转换linux/unix下就会以为是一行,所以拿过来需要转换一下。还有一个参数IFS是设置分割符的,以下是几个案例:

root@hack test]# cat iptest.sh 

#/bin/bash

IPS="10.1.1.10 3001

10.1.1.10 3003

10.1.1.11 3001

10.1.1.11 3002

10.1.1.11 3004

10.1.1.11 3005

10.1.1.13 3002

10.1.1.13 3003

10.1.1.13 3004

10.1.1.14 3002"

echo "====while test ===="

i=0


echo $IPS | while read line

do

    echo $(($i+1))

    echo $line

done



echo "====for test ===="

n=0

for ip in $IPS ;

do

   n=$(($n+1))

   echo $ip

   echo $n

done

[root@hack test]# 

结果

[root@hack test]# sh iptest.sh 

====while test ====

1

10.1.1.10 3001 10.1.1.10 3003 10.1.1.11 3001 10.1.1.11 3002 10.1.1.11 3004 10.1.1.11 3005 10.1.1.13 3002 10.1.1.13 3003 10.1.1.13 3004 10.1.1.14 3002

====for test ====

10.1.1.10

1

3001

。。。。。。。

10.1.1.14

19

3002

20

[root@hack test]有的人说是echo $IPS会将所有输出当成一个整体通过管道传输给下一个进程所以在一行,当然添加IFS="\n"之后肯定你已经猜到了,后边的这个案例是把IPS添加到文件了,这个while和for的区别更明显,结果自己尝试

[root@hack test]# cat iptest2.sh 

#/bin/bash

#IFS="\n"

echo "====while test ===="

while read line

do

   echo $line 

done < ./ip.log



echo "====for test ===="

for ip in `cat ip.log`;

do

   echo $ip

done

[root@hack test]#