In a for loop like this,
for i in `cat *.input`; do
echo "$i"
done
if one of the input file contains entries like *a, it will, and give
the filenames ending in 'a'.
Is there a simple way of preventing this filename expansion?
Because of use of multiple files, globbing (set -o noglob) is not a
good option. I should also be able to filter the output of cat to
escape special characters, but
for i in `cat *.input | sed 's/*/\\*'`
...
still causes *a to expand, while
for i in `cat *.input | sed 's/*/\\\\*'`
...
gives me \*a (including backslash). [ I guess this is a different
question though ]
This will
catthe contents of all the files and iterate over the lines of the result:If the files contain globbing characters, they won't be expanded. They keys are to not use
forand to quote your variable.In Bourne-derived shells that do not support process substitution, this is equivalent:
The reason not to do that in Bash is that it creates a subshell and when the subshell (loop) exits, the values of variables set within and any
cddirectory changes will be lost.