shell的for while读取文件写法和区别

2020-03-05  本文已影响0人  水平号

1、两种循环基本写法

常见的while和for循环的写法,大概有如下几种:

(1) 通过输入重定向到while循环

while read -r line
do
echo $line
done < file(待读取的文件)

(2) 通过cat命令输出重定向到while循环

cat file(待读取的文件) | while read line
do
echo $line
done

(3) for循环读取命令输出

for line in `cat filename`
do
echo $line
done

(4) for循环读取命令输出

for line in $(cat filename)
do
 echo $line
done

2、两种循环的区别

while循环:会将每行的内容读入到line变量,当while出现空行,用if判断字符=0, contiun

for循环: 将读入的内容以IFS(shell中的环境变量,Internal Field Seperator,字段分隔符)为界分隔, 然后将各个分隔开的内容,逐一读入变量line。本质上说,for循环读取的是字段,只不过可以设置IFS为\n这样能够逐行读取。

如果希望for处理文件按回车分隔,则需重新定义分隔符 IFS:内部字段分隔符 IFS=$'\n'

示例1

$ cat file
aaaa
bbbb fff ggg
cccc dddd

$ cat file | while read line; do echo $line; done           #while读取文件
aaaa
bbbb fff ggg
cccc dddd

$ for line in $(<file); do echo $line; done                #for循环读取文件
aaaa
bbbb
fff
ggg
cccc
dddd

$ IFS=$'\n'                                                          #配置IFS(字段分隔符)为回车
$ for line in $(<file); do echo $line; done            #for循环读取文件(修改IFS)
aaaa
bbbb fff ggg
cccc dddd

示例2

#!/usr/bin/bash

while read line
do
        if [ -z "$line" ];then             #判断字符串为空格时,跳过本次循环
              continue
        fi
        hosts[++i]=$line    #普通数组赋值
done </etc/hosts

echo "hosts first: ${hosts[1]}"

for i in ${!hosts[@]}          #数组遍历,i保存了数组的索引
do
        echo "$i:  ${hosts[i]}"        # ${hosts[i]} 通过索引获取值
done

#!/usr/bin/bash
OLD_IFS=$IFS                        #先保存原来的IFS
IFS='                                    
'                                               #再修改IFS为回车
for line in `cat /etc/hosts`
do
        hosts[++j]=$line
done

for i in ${!hosts[@]}
do
        echo "$i:  ${hosts[i]}"
done
IFS=$OLD_IFS                   #用完后再修改回原来的IFS

上一篇下一篇

猜你喜欢

热点阅读