说到按行来从文件读取数据,正常我们肯定会直接用while来实现的。但是在某些特殊情况下使用while可能会出现问题(例如while循环里嵌套sshpass命令时,while在从文件读取数据时,只读取第一行数据就自动退出了,并且退出状态为0),所以这里测试下用for循环来逐行从文件读取数据。
一、先拿一个错误的用法来做示例
1.1 目前有info.txt这个文件,里面存储了以空格分割的IP、用户名、密码等信息。
1 2 3 4 5 |
[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 ~]# |
1.2 我们按照while的习惯来写脚本尝试使用for读取文件每行数据(当然下面这个脚本是有问题的)。
1 2 3 4 5 6 7 8 |
[root@imzcy ~]# cat test.sh #!/bin/bash for i in $(cat /root/info.txt); do echo $i done [root@imzcy ~]# |
1.3 因为for循环会以空格分割读入的数据,所以如果像上面脚本那样调用输出显然不是我们希望看到的情况。
1 2 3 4 5 6 7 8 9 10 11 |
[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 ~]# |
二、shell下使用for循环来按行从文件读入数据(每次读入一整行数据)
2.1、修改后的脚本如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[root@imzcy ~]# cat zcy.sh #!/bin/bash #author:zcy #date:2018-09-06 #from: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 ~]# |
2.2执行结果如下所示:
1 2 3 4 5 |
[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 ~]# |