在脚本中,循环语句多用于对文件的操作,如果如启动某个目录下的脚本文件或对数据 文件进行读取,如果对数据文件进行操作,需要使用嵌套循环,因为文本文件一般由行 和列组成,外层循环读取以行为单位的数据,内层循环操作的是以某个分隔符分割的一 行数据。另外,根据不同情况修改 IFS 环境变量,下面通过例子说明如何对数据文件进行操作。
-
首先创建一个文本文件 file08:
1501010001 71.05 2141618 3 07/11/15 21:46:57 1006 User001 109 4 303 1501010002 865.86 1686831 2 05/11/15 03:52:44 1009 User009 109 1 302 1501010003 652.61 2587675 2 07/14/15 19:17:39 1010 User003 110 1 305 1501010004 905.24 1282788 1 04/17/15 17:14:09 1010 User004 102 3 304 1501010005 444.25 1624680 1 04/05/15 11:40:51 1005 User009 108 1 308
- 测试数据是从销售流水表中抽取的五条销售数据,共十个字段,是流水号、销售金额、 卡号、记录状态、销售日期、销售员编码、销售员名称、pos 机号、客户类别和销售门 店号。
-
我们要采用嵌套循环的方式读取文件内容,字段分隔符是制表符,还有分隔每一条记录的换行符,需要对变量 IFS 进行设置。
#!/bin/bash # 数据文件 datafile=/home/yarn/bash01/file08 # 保存默认设置 IFS_bak=$IFS # 设置分割符为换行符 IFS=$'\n' # 从文件中读取行 for line in `cat $datafile` do # 设置字段分割符为制表符 IFS=$'\t' # 对每一行数据进行分割读取 for column in $line do echo -n "$column " done # 换行 echo done # 还原默认设置 IFS=$IFS_bak
-
控制台显示:
1501010001 71.052141618 3 07/11/15 21:46:57 1006 User001 109 4 303 1501010002 865.86 1686831 2 05/11/15 03:52:44 1009 User009 109 1 302 1501010003 652.61 2587675 2 07/14/15 19:17:39 1010 User003 110 1 305 1501010004 905.24 1282788 1 04/17/15 17:14:09 1010 User004 102 3 304 1501010005 444.25 1624680 1 04/05/15 11:40:51 1005 User009 108 1 308
-
需要注意的是变量 IFS 需要设置两次,第一次是分割行,第二次是分割字段。循环执行完毕后要还原 IFS 变量的默认值。