说到按行来从文件读取数据,正常我们肯定会直接用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 ~]#
本文采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。
如果您的问题未解决,欢迎微信扫描右侧二维码与我联系。