Home > Mobile >  How to use Internal Field Separator correctly?
How to use Internal Field Separator correctly?

Time:10-15

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?

CodePudding user response:

  • IFS=':' read -r line reads the complete line
  • IFS=':' read -r name remainder puts the first field in the variable name and the rest of the line in remainder
  • IFS=':' read -r name password remainder puts the first field in the variable name, the second field in the variable password and the rest of the line in remainder.
  • etc...

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

CodePudding user response:

You're only setting IFS for the read command. When you expand the $line variable, it's set back to the original value. You need to set IFS there, not when reading.

oldIFS="$IFS" # save IFS
IFS=:

while read -r line; do
    set $line
    echo $1
done < $FILE

IFS="$oldIFS" # restore original IFS
  • Related