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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.