I just had to write a Linux bash shell script that has a for loop that reads a file, where that file contains lines with blank spaces in it. This sounds simple, but blank spaces cause major problems in a Bash for loop.
Fortunately there’s a simple solution: Before the
for loop, declare the input field separator to be a newline character, as shown in this for loop code:
local filecount=1 IFS=$'\n' for i in `cat $FILES_FOUND` do if [ $filecount -eq $fileNumber ]; then filename=`echo $i | cut -d: -f1` exploreFile $filename fi (( filecount++ )) done
In this code, the variable
FILES_FOUND is the name of a file that contains a list of strings, and those strings can contain blank spaces anywhere in each line.
As an example of how this works, imagine that the file contains ten records, and each record has ten blank spaces. When I use the
IFS as shown, the for loop properly iterates ten times, once for each record. But if I had not used the
IFS declaration, the for loop would have executed 100 times (10 times 10). That little
IFS setting is huge when looping over lines in a file that have blank spaces.