Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: НЕ могу разобраться с foreach  (Прочитано 1330 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн prizes

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
НЕ могу разобраться с foreach
« : 12 Апрель 2016, 06:57:38 »
есть файл с номерами и id писем mail.ru в формате (условно цифры напишу)
1 657433
2 125744
3 788996  и т.д. Цель подключиться к pop.mail.ru и циклом задать команду отображения писем
top номер_письма количество символов. Т.е надо:
top 1 100
top 2 100
top 3 100  (100 это кол-во отображаемых символов письма)
Для подключения использую expect(команды expect, send и т.д) но вот цикл не могу задать. Знаю что команда foreach но нифига не получается. Кто подскажет какой у нее синтаксис?

Оффлайн unimix

  • Активист
  • *
  • Сообщений: 537
    • Просмотр профиля
Re: НЕ могу разобраться с foreach
« Ответ #1 : 12 Апрель 2016, 09:59:44 »
Ты про какой язык?

Если PHP, то foreach перебирает массив. Например, при чтении файла ты создал массив:
Код: PHP
  1. $list = array(
  2. 1 => 657433,
  3. 2 => 125744,
  4. 3 => 788996
  5. );

тогда перебор будет вида:
Код: PHP
  1. // Подключаешься к pop серверу
  2. foreach ( $list as $mail_num => $mail_id ) {
  3.     // Получаешь информацию о письмах. $mail_num - номер письма; $mail_id - id письма
  4. }
  5. // Отключаешься от pop сервера

Как там работать с pop сервером я уже и не помню.
Более подробно про foreach в PHP: http://php.net/manual/ru/control-structures.foreach.php

Оффлайн prizes

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
Re: НЕ могу разобраться с foreach
« Ответ #2 : 12 Апрель 2016, 10:55:59 »
Код: Bash
  1. #!/usr/bin/expect -f
  2. log_file rec_orig.log
  3. spawn openssl s_client -ign_eof -connect pop.mail.ru:995
  4. expect "+OK"
  5. send "user здесь_имя_пользователя\r"
  6. expect "+OK"
  7. send "pass здесь_пароль\r"
  8. expect "Welcome"
  9. send "list\r"
  10. send "quit\r"
  11. expect eof
Этим скриптом я получаю общий список писем со всеми служебными сообщениями в лог файл.Затем работает другой скрипт, который откидывает всю служебную информацию и старые письма. т.е в отдельный файл записываются только номера и id новых писем. Теперь мне эти новые письма необходимо прочитать командой top x y.
где x - это номер письма, y - кол-во символов письма.
Только не знаю как задать цикл чтобы скрипт брал номер письма из файла.
« Последнее редактирование: 13 Апрель 2016, 10:01:56 от Azure »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: НЕ могу разобраться с foreach
« Ответ #3 : 12 Апрель 2016, 11:45:48 »
Код: Bash
  1. #!/bin/bash
  2. while read mail_n mail_s ; do
  3.     top $mail_n $mail_s
  4. done < separate.list > result.all
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн prizes

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
Re: НЕ могу разобраться с foreach
« Ответ #4 : 13 Апрель 2016, 05:22:22 »
Для Azure. Ни хрена конечно не понял что ты имел ввиду.
1)Видел у меня полный листинг скрипта, не написал только свой логин и пароль, но все равно понятно куда их вставлять т.к. написал русскими буквами здесь логин, аздесь пароль. Твои же 3 строчки мне не о чем не говорят
2) Идея твоего примера описывается баш скриптом как будто top это команда баша, но это не так. команда top начинает работать когда ты уже подключишься к серверу pop.mail.ru.это его внутренняя команда.
Или поправьте если я торможу

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: НЕ могу разобраться с foreach
« Ответ #5 : 13 Апрель 2016, 09:32:52 »
prizes, Давая половину информации Вы хотите получить готовое решение?
Затем работает другой скрипт, который откидывает всю служебную информацию и старые письма. т.е в отдельный файл записываются только номера и id новых писем. Теперь мне эти новые письма необходимо прочитать командой top x y.
где x - это номер письма, y - кол-во символов письма.
Только не знаю как задать цикл чтобы скрипт брал номер письма из файла.
Как — я Вам написал. В какой скрипт и как вставлять Вы и «сами с усами» как я понял.


Пользователь добавил сообщение 13 Апрель 2016, 09:57:25:
Код: TCL
  1. set ufile [open "your_path/your_log.file" r]
  2. foreach uline[split [read $ufile] "\n"] {
  3.   set mail_n [lindex $uline 0]
  4.   set mail_s [lindex $uline 1]
  5.   if { [string length $mail_s] > 0 } {
  6.     send "top $mail_n $mail_s \r"
  7.   }
  8. }
  9. close $ufile
« Последнее редактирование: 13 Апрель 2016, 09:59:50 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн prizes

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
Re: НЕ могу разобраться с foreach
« Ответ #6 : 14 Апрель 2016, 10:21:25 »
Что-то моих усов не достаточно. Прежде чем применить данный цикл на pop.mail.ru решил это отрепетировать на соседнем компьютер по ssh. вот такой вот скрипт(прокоментирую как я это понимаю, поправьте меня там где я не правильно понимаю):
#!/usr/bin/expect -f                            #объявляю что командый интерпритатор это expect
log_file ee.log                                 #лог файл ee.log в той же дериктории где лежит сам скрипт
set ufile [open "idpisma.log" r]                ###объявление переменной ufile, значение которой является    содержимое файла idpisma.log#######
foreach uline[split [read $ufile] "\n"] {       #присваивать переменной uline построчно значение переменной  ufile
set mail_n [lindex $uline 0]                    #значение переменной mail_n это 1-й столбец переменной uline
set mail_s [lindex $uline 1]                    #значение переменной mail_s это 2-й столбец переменной uline
spawn ssh administrator@192.168.0.116           #подключиться к 192.168.0.116
expect "passw"                                  #найти слово pass
send "1221\r"                                   #когда нашел отправить 1221
if { [string length $mail_s] > 0 } {            #если строка не пустая тогда,
send "echo $mail_n $mail_s \r"                  #отправить команду echo $mail_n $mail_s
}
}
close $ufile                                    #это не знаю для чего,наверное закроем файл который открывали
expect eof                                      #найти конец файла

ТАК НЕ РАБОТАЕТ, ЧТО НАДО ИСПРАВИТЬ????

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5660
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: НЕ могу разобраться с foreach
« Ответ #7 : 15 Апрель 2016, 00:10:57 »
Я фиг его знает что Вы там проверяете на «соседнем компьютере по ssh», потому как Ваш код выглядит как дикий бред…
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн prizes

  • Автор темы
  • Любитель
  • *
  • Сообщений: 57
    • Просмотр профиля
Re: НЕ могу разобраться с foreach
« Ответ #8 : 15 Апрель 2016, 05:00:13 »
Хорошо. Приведи пример 100% рабочего кода с этим циклом. Но только не на локальной машине, а подключившись куда либо т.е компьютер А подключился к компьютеру Б и выполнил код с циклом

Пользователь добавил сообщение 15 Апрель 2016, 05:45:56:
ЗАРАБОТАЛО. Вот такой скрипт получился.

#!/usr/bin/expect -f
log_file ee.log
set ufile [open "idpisma.log" r]
spawn openssl s_client -ign_eof -connect pop.mail.ru:995
expect "+OK"
send "user здесь_логин\r"
expect "+OK"
send "pass здесь пароль\r"
expect "Welcome"
send "list\r"
foreach uline [split [read $ufile] "\n"] {
set mail_n [lindex $uline 0]
if { [string length $mail_n] > 0 } {
send "top $mail_n 200 \r"
}
}
close $ufile
send "quit\r"
expect eof

Azure спасибо, реально помог. Теперь понимаю как пользоваться данной командой.
« Последнее редактирование: 15 Апрель 2016, 05:45:56 от prizes »

 

Страница сгенерирована за 0.117 секунд. Запросов: 24.