Документ создан: 20.11.2012

Работа со списками в bash.

Описание проблемы.

Представим ситуацию: нам нужно обработать список директорий, начинающихся на "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".

 
Recent changes RSS feed Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki Donate