shell下for循环每次读入文件一行数据

- 脚本

说到按行来从文件读取数据,正常我们肯定会直接用while来实现的。但是在某些特殊情况下使用while可能会出现问题(例如while循环里嵌套sshpass命令时,while在从文件读取数据时,只读取第一行数据就自动退出了,并且退出状态为0),所以这里测试下用for循环来逐行从文件读取数据。


错误示例

目前有info.txt这个文件,里面存储了以空格分割的IP、用户名、密码等信息。

[root@imzcy ~]# cat info.txt 
192.168.1.1 zhangsan 123456
192.168.1.2 lisi 111111
192.168.1.3 wangwu 22222
[root@imzcy ~]# 

我们按照while的习惯来写脚本尝试使用for读取文件每行数据(当然下面这个脚本是有问题的)。

[root@imzcy ~]# cat test.sh 
#!/bin/bash
 
for i in $(cat /root/info.txt);
do
        echo $i
done
[root@imzcy ~]# 

因为for循环会以空格分割读入的数据,所以如果像上面脚本那样调用输出显然不是我们希望看到的情况。

[root@imzcy ~]# sh test.sh 
192.168.1.1
zhangsan
123456
192.168.1.2
lisi
111111
192.168.1.3
wangwu
22222
[root@imzcy ~]# 




使用for循环每次读入一行

修改后的脚本如下所示:

[root@imzcy ~]# cat zcy.sh 
#!/bin/bash
# author: zcy
# site: https://www.imzcy.cn

f=/root/info.txt
l=`cat $f |wc -l`
 
 
for i in `seq 1 $l`;
do
        cat $f |head -n $i |tail -n 1
        sleep 1
done
[root@imzcy ~]# 

执行结果如下所示

[root@imzcy ~]# sh zcy.sh 
192.168.1.1 zhangsan 123456
192.168.1.2 lisi 111111
192.168.1.3 wangwu 22222
[root@imzcy ~]#