bashifs

How to use Internal Field Separator correctly?


I am trying to set the IFS to ':', but it seems to not work. Here is my code,

FILE="/etc/passwd"

while IFS=':' read -r line; do
        set $line
        echo $1
done < $FILE

When I run my code, it seems to give me the entire line. I have used the set command to assign positional parameters, to extract only the username, but it output the entire line when I try to print the first positional argument $1. What am I doing wrong?


Solution

  • In bash you can use read -a array_var for getting an array containing all the fields, and that's probably the easiest solution for your purpose:

    #!/bin/bash
    
    while IFS=':' read -r -a fields
    do
        echo "${fields[0]}"
    done < /etc/passwd