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 lineIFS=':' read -r name remainder
puts the first field in the variablename
and the rest of the line inremainder
IFS=':' read -r name password remainder
puts the first field in the variablename
, the second field in the variablepassword
and the rest of the line inremainder
.- 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