一次逐行读取文件想到的

                 今天在chinunix看到一个shell问题的问题,就是读取下面的文件,我第一反应就是通过while循环,于是乎有了下面的脚本语句。
Test文件内容。
www.game.com 202.106.5.21 8GB 73GB
www.173.com 114.106.5.21 16GB 73GB
www.13game.com 112.80.5.21 32GGB 73GB
范例1:
#!/bin/bash
while read line
do
echo $line
done <test
然后执行,[root@localhost ~]# ./while_read
www.game.com 202.106.5.21 8GB 73GB
www.173.com 114.106.5.21 16GB 73GB
www.13game.com 112.80.5.21 32GGB 73GB
                      哈哈,还不错是自己想要的结果。但是我们不能满足在这一点的喜悦上哦,有没有其他的方法呢,for循环试试怎么样,于是乎又有了下面的范例。
范例2
For脚本
#!/bin/bash
for I in `cat test`
do
echo $i
done
输出结果
[root@localhost ~]# ./for
www.game.com
202.106.5.21
8GB
73GB
www.173.com
114.106.5.21
16GB
73GB
www.13game.com
112.80.5.21
32GGB
73GB
                           问题来了,怎么和我们想要的结果不一样呢。原来for循环语句读取行的时候遇到空字符的时候会令其一行输出结果的,那有没有什么好的方法输出我们想要的结果呢,方法很简单,看下面的语句。
例3
#!/bin/bash
OIFS=$IFS
IFS='\n'
for i in `cat a`
do
echo $i
done
IFS=$OIFS
      在这里加一个换行符即可。
输出结果[root@localhost ~]# ./for. ofs
www.game.com 202.106.5.21 8GB 73GB
www.173.com 114.106.5.21 16GB 73GB
www.13game.com 112.80.5.21 32GGB 73GB
     那么
While read line
do echo $line
done <test
               是怎么工作的呢,下面我们来仔细研究下,其实这主要牵扯到read语句的读取方式,read是按行读取文件的,也就是以\n为分隔符的,所以read每次都读取一行, 然后把读取的内容赋值给变量$line,然后输去出来。既然知道了原理就好理解了。这里的语句就是依次读取tesfile的内容,然后输出到屏幕上,每读一行输出到屏幕上,每读一行输出到屏幕上,直到读取完文本里的内容为止。于是乎就看到我们想要的结果了。
我们注意下红色部分的内容,既然这里说的是依次读取文本的内容然后输出出来,那我们如果知道文本的行数然后依次循环相关的行数是不是也能实现相关的操作呢,答案是肯定的。看下面的例子。
例4
#!/bin/bash
for i in $(seq `wc -l a|cut -d' ' -f1`)
do read line
echo $line
done < test
              注释:这里的wc -l  test |cut -d' ' -f1`语句用来统计文本的行数,而加上seq用来做计数。下面举个例子。
[root@localhost ~]# seq 4
1
2
3
4
             这样的话这个句子就好理解了。for i in $(seq `wc -l a|cut -d' ' -f1`)语句用来按照$(seq `wc -l a|cut -d' ' -f1`)指定的次数进行循环,第一次循环的时候读取文本的第一行内容,并且把读取的内容赋值给变量line然后通过echo $line语句打印出来,依次类推直到打印到文件的最后一行。
下面我们在注意这个语句:“直到读取完文本里的内容为止”,我们能不能有这个思路呢,就是一直不停的读取文本的内容,直到读取的内容读完位置然后结束呢。大家这里可能会想到死循环了吧,没错就是使用死循环。说到死循环大家想到的肯定是while true语句,没错下面我们就用while true语句来实现相同的操作。
例5
#!/bin/bash
while :
do read line
if [ ! -n "$line" ];then
break
fi
echo $line
done < test
                 注释:这里也好理解,首先依次读取test文件,然后赋值给变量line,由于这是个死循环,会一直读取下去,当超过规定的文件行数的时候我们要跳出循环,于是这里用break来控制跳槽循环。
死循环,哈哈!有没有其他的死循环的实现方式呢,答案是肯定的。看下面的列子
for ((i=1;i>=1;i++))
do read line
if [ ! -n "$line" ];then
break;fi
echo $line
done < test
最后不知道大家还有没什么方式来实现读取文件的方式呢。

本文出自 “虚心求教” 博客,请务必保留此出处http://nanwangting.blog.51cto.com/608135/933873