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