Представим ситуацию: нам нужно обработать список директорий, начинающихся на "D". Казалось бы, проще простого:
for i in $(ls -1 | grep "^D"); do echo $i; done
Только есть одно "но". Вот оно (сравните листинги):
$ ls -1 | grep "^D" Dark Tranquility Deep Purple Def Leppard Depeche Mode Dire Straits
$ for i in $(ls -1 | grep "^D"); do echo $i; done Dark Tranquility Deep Purple Def Leppard Depeche Mode Dire Straits
Дело в том, что пробел считается разделителем списка. При работе с директориями или файлами можно выйти из положения таким образом:
$ for i in D*; do echo $i; done Dark Tranquility Deep Purple Def Leppard Depeche Mode Dire Straits
Однако, при формировании списка по содержимому файла, где строка — элемент списка, такое не выйдет и строки, содержащие пробел, будут поделены на несколько элементов списка.
$ cat elements Строка номер 1 Строка2 Строка N3
$ for i in $(< elements); do echo $i; done Строка номер 1 Строка2 Строка N3
Решить проблему можно изменив значение переменной окружения "IFS" (Internal Field Separator), на "$'\x0a'". Это значение указывает, что разделителем списка будет новая строка (Ctrl+J).
$ OLD_IFS=${IFS}; IFS=$'\x0a'; for i in $(< elements); do echo $i; done; IFS=${OLD_IFS} Строка номер 1 Строка2 Строка N3
Ещё один вариант (просто нажмите "Enter" после первой скобки в значении переменной "IFS"):
$ OLD_IFS=${IFS}; IFS=" > "; for i in $(< elements); do echo $i; done; IFS=${OLD_IFS} Строка номер 1 Строка2 Строка N3
Описанные способы так же относятся и к формированию списка с помощью "select".