Bash, read line by line from file, with IFS

前端 未结 4 1484
独厮守ぢ
独厮守ぢ 2020-12-09 05:50

I\'m having this code from http://bash.cyberciti.biz/guide/While_loop, used to read line by line from a file

file=/etc/resolv.conf
while IFS= read -r line
         


        
相关标签:
4条回答
  • 2020-12-09 06:21

    In this case, IFS is set to the empty string to prevent read from stripping leading and trailing whitespace from the line.

    Changing IFS is usually done to control how the input will be split into multiple fields. But in this case, because there's only one variable name given to read, read won't ever split the input into multiple fields regardless of the value of IFS. It will, however, remove the leading and trailing whitespace as mandated in the POSIX specification (assuming the value of IFS contains whitespace or is unset).

    See the POSIX specification for read and field splitting for details about how it works.

    0 讨论(0)
  • 2020-12-09 06:22

    In the third example on that page, setting IFS to null prevents word splitting which makes that code not work. Here is that code:

    while IFS= read -r field1 field2 field3 ... fieldN
    do
        command1 on $field1
        command2 on $field1 and $field3
        ..
        ....
        commandN on $field1 ... $fieldN
    done < "/path/to dir/file name with space"
    

    As written, all the words on the line are stored in field1 and field2, etc., are empty. Change the line to this and it will work properly:

    while read -r field1 field2 field3 ... fieldN
    
    0 讨论(0)
  • 2020-12-09 06:27

    To make IFS a genuine line separator, use IFS=$'\012'.

    0 讨论(0)
  • 2020-12-09 06:39

    IFS is a variable for the line separator (or actually "Internal Field Separator"). That code will effectively empty out the line separator for your read command and set it to its default. Sometimes IFS is changed somewhere else in the code due to users wanting other "line" endings, like reading one sentence at a time (IFS=.) or similar.

    I guess they included the IFS= here just to make sure it works or everyone, regardless of the previous value on the IFS variable. The code should still work without IFS=

    0 讨论(0)
提交回复
热议问题