I want to iterate through a list of files without caring about what characters the filenames might contain, so I use a list delimited by null characters. The code will explain things better.
# Set IFS to the null character to hopefully change the for..in
# delimiter from the space character (sadly does not appear to work).
IFS=$'\0'
# Get null delimited list of files
filelist="`find /some/path -type f -print0`"
# Iterate through list of files
for file in $filelist ; do
# Arbitrary operations on $file here
done
The following code works when reading from a file, but I need to read from a variable containing text.
while read -d $'\0' line ; do
# Code here
done < /path/to/inputfile
The preferred way to do this is using process substitution:
while IFS= read -r -d $'\0' file <&3; do
# Arbitrary operations on "$file" here
done 3< <(find /some/path -type f -print0)
If you were hell-bent on parsing a bash variable in a similar manner, you can do so as long as the list is not NUL-terminated.
Here is an example of bash var holding a tab-delimited string:
$ var="$(echo -ne 'foo\tbar\tbaz\t')"
$ while IFS= read -r -d $'\t' line <&3; do
echo "#$line#"
done 3<<<"$var"
#foo#
#bar#
#baz#