美文网首页
shell的for while读取文件写法和区别

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

作者: 水平号 | 来源:发表于2020-03-05 17:31 被阅读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
    
    

    相关文章

      网友评论

          本文标题:shell的for while读取文件写法和区别

          本文链接:https://www.haomeiwen.com/subject/ujvqrhtx.html