The IFS

By default, the IFS variable has the value of one of (space, newline, or tab).

Suppose that you have a file like the following and you want to iterate over its lines:

Hello, this is a test 
This is the second line 
And this is the last line 

Let's write the for loop that will iterate over these lines:

#!/bin/bash 
file="file1.txt" 
for var in $(cat $file) 
do 
echo " $var" 
done 

If you check the result, it's something that we don't need:

Since the first separator the shell found is the space, the shell treats every word as a field, but we need every line to be printed as a field.

Here we need to change the IFS variable to be newline instead.

Let's modify our script to iterate over lines correctly:

#!/bin/bash 
file="file1.txt" 
IFS=$'\n'   #Here we change the default IFS to be a newline 
for var in $(cat $file) 
do 
echo " $var" 
done 

We changed the IFS variable to newline and it works as expected.

Look at the dollar sign in the IFS definition in the preceding section, IFS=$"\n". By default, bash doesn't interpret escape characters such as \r\n, and \t. So, in our example, it will be treated as an n character, so to interpret escape characters, you have to use a dollar sign ($) before it to make it work properly.

But if your IFS is a normal character, you don't have to use the dollar sign ($) at all.