Internal Field Separator (IFS): This internal variable in bash shell turns out to be an indispensable tool in these days of spaces and other weird characters in filenames. Anyone who has tried to script in bash which involved accessing lot of filenames have definitely come across the problem of spaces in filenames.
The problem is this. It becomes impossible to split a directory listing "ls" into filenames using just the for $i in `ls` command. And the reason is simple. The directory listing separates filenames by spaces but the filenames themselves might have spaces. So the for command cannot figure out where the filename ends and where it begins. That is where this neat trick comes in. We have to tell bash to ignore all separation symbols other than newline while splitting up the directory listing into filenames. This means each line would be a new filename. And we have to make sure that each line has a new filename. This is easily achieved by the "ls -1" command.
So here's what needs to be done.
#!/bin/bash
IFS=$'\n'
for $i in `ls -1`
do
.................
.................
done
NOTE :-
- IFS can set \n only in bash. sh cannot understand the escape sequence.
- The value of \n must be assigned. So a $ sign in front is needed.
- Single quotes has to be used '\n'. Double quotes will not work. "\n" will not work.
Comments