Bash, файлы, пробелы, скобки и прочее…

Привет,

Данная статья более пригодиться начинающим скриптоводам, т.к. незнание этого заставляет делать их ужасные вещи 🙂  По специфике работы мне частно, даже очень часто, приходится парсить много текстовой информации — логи, файлы.
И если в имени файла есть пробел, скобки и что-то еще банальный цикл по массиву таких строк падает и рушит всю вашу задумку.
Простейший пример, на котором начинающие начинают осознавать свою беспомощность 🙂

for i in `find . -type f`; do
echo ${i}
done

все вроде логично, цикл по результатам работы find и выводим каждую строку на экран.

[user@ora6 20121119]$ ls -1
Файл_с_подчеркиванием.txt
Файл с пробелами.txt
Обычный файл_2012.txt
Папка1
Папка1/Много файлов с пробелами1
Папка1/Много файлов с пробелами2

Посмотрим что у нас будет не выходе, после работы скрипта

[user@ora6 20121119]$ for i in `find . -type f`; do echo ${i}; done
Файл_с_подчеркиванием.txt
Файл
с
пробелами.txt
Обычный
файл_2012.txt
Папка1
Папка1/Много
файлов
с
пробелами1
Папка1/Много
файлов
с
пробелами2

Не совсем то, да? А все потому что все шеллы (ну по крайней мере sh\bash\tcsh\csh), понимают под разделителем строк — пробел. Наша задача — это переопределить.

Для этого нам понадобятся пара переменных окружения $IFS, $OFS, которые мы и переназначим на понятный и привычным нам символ перевода строки. Таким образом наш скрипт будет выглядеть вот так

ORIGIFS=$IFS
ORIGOFS=$OFS;

IFS=$(echo -en "\n\b")
OFS=$(echo -en "\n\b")

for i in `find . -type f`; do
echo ${i}
done

IFS=$ORIGIFS
OFS=$ORIGOFS

Вот и все! 🙂