LINUX.ORG.RU

bash for loop


0

0
Пишу простоейший обработчик запросов для формирования списков доступа, к софту не поддерживающему ldap. Код простой

for i in `adtool attributeget jabber member|sed -e 's/^\S*=/"/;s/,\S*/"/'`;do adtool attributeget $i sAMAccountName; done

Однако по непонятной причине, в $i данные находятся не по строчкам, а по словам. Можно принудительно заставить for формировать списки не используя в качестве разделителя пробел?

★★★★★
> for i in `adtool attributeget jabber member|

for i in `echo adtool attributeget jabber member|cut -d ' '|sed -e 's/^\S*=/"/;s/,\S*/"/'`;

как нибудь так не проканает?
Anoxemian ★★★★★
()
Ответ на: комментарий от sdio
Не работает.

adtool attributeget jabber member|sed -e 's/^\S*=/"/;s/,\S*/"/'

выводит данные в формате "Имя Фамилия Отчество", а в результате работы твоей команды выводится только "Имя

Orlangoor ★★★★★
() автор топика
Ничего умнее чем заменить седом пробел на _ а потом далее заменить обратно я не придумал. Но это слишком уж костыльно
Orlangoor ★★★★★
() автор топика
Ответ на: комментарий от Orlangoor
Не верю
$ printf "aaa aaa\nbbb bbb\nccc ccc\n"
aaa aaa
bbb bbb
ccc ccc

$ printf "aaa aaa\nbbb bbb\nccc ccc\n" | while read i; do echo $i; done
aaa aaa
bbb bbb
ccc ccc

sdio ★★★★★
()
Ответ на: комментарий от sdio
Поверь...

$adtool attributeget jabber member|sed -e 's/^\S*=/"/;s/,\S*/"/'
"xxxx xxxx xxxx"
"yyyy yyyy yyyy"

$adtool attributeget jabber member|sed -e 's/^\S*=/"/;s/,\S*/"/' | while read i; do adtool attributeget $i sAMAccountName; done
error: "xxxx not found
error: "yyyy not found

Orlangoor ★★★★★
() автор топика
Ответ на: комментарий от gr_buza
Что конечно случайность, но способ бузы работает. Остальные нет
Orlangoor ★★★★★
() автор топика
Ответ на: комментарий от Orlangoor
_IFS=$IFS;IFS=$'\n'
... что-то делаем с данными, содержащие пробельные символы
IFS=$_IFS
... возвращаемся в нормальный режим отработки
Slavaz ★★★★★
()
Ответ на: комментарий от wfrr
>Блин, а писать на питоне не проще? Ведь и рабоать будет быстрее.

Мне например не проще, т.к. я не знаю его, да и такая ли большая разница, когда несколько подобных скриптов запускаются раз в час - это секунда времени

Orlangoor ★★★★★
() автор топика
Ответ на: комментарий от Orlangoor
... | while read -d"
" i; do
  echo $i
done

А так работает? (впрочем, это ~= IFS)
sdio ★★★★★
()
Ответ на: комментарий от Orlangoor
Мне тоже интересно --- это баг или фича. Какая версия bash?

Что будет, если использовать встроенную переменную REPLY?

printf "aaa aaa\nbbb bbb\nccc ccc\n" | while read ; do echo "$REPLY"; done

mky ★★★★★
()
Ответ на: комментарий от mky
>Мне тоже интересно --- это баг или фича. Какая версия bash?

Фича. for в bash сколько себя помню _всегда_ разделял аргументы по любому пробельному символу.

for i in "aa bb cc"; do... - постоянно юзающееся решение.

Кстати, for i in *; do ... - тут "*" вернёт разделённый пробелами список файлов. Так что иначе - никак.
KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73
>Фича. for в bash

В данный момент речь идет о конструкции вида:

stream | while read VAR; do
sdio ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.