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.