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
, i
For the example you have, a simple cat *.input
will do the same thing.
This will cat
the contents of all the files and iterate over the lines of the result:
while read -r i
do
echo "$i"
done < <(cat *.input)
If the files contain globbing characters, they won't be expanded. They keys are to not use for
and to quote your variable.
In Bourne-derived shells that do not support process substitution, this is equivalent:
cat *.input | while read -r i
do
echo "$i"
done
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 cd
directory changes will be lost.