URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8156
[ Назад ]

Исходное сообщение
"Бесконечный цикл в SH"

Отправлено Daert , 16-Мрт-09 18:54 
Задание такое:
Написать бесконечный цикл, который будет раз в секунду выводить постоянно увеличивающееся число (1, 2, 3, 4 ...).

вот что я наваял

#!/bin/sh
i=1
while true
do
echo $1, sleep 1
i = 'expr $1+1'
done

Укажите ошибки, и если это возможно в каком направлении двигацо... этот ли оператор цикла оптимален для этой задачи?
Заранее спасибо.

З.Ы: ногами пролшу сильно не пинать.. перывае 2 часа сижу за sh...


Содержание

Сообщения в этом обсуждении
"Бесконечный цикл в SH"
Отправлено mikra , 16-Мрт-09 19:34 
>[оверквотинг удален]
>do
>echo $1, sleep 1
>i = 'expr $1+1'
>done
>
>Укажите ошибки, и если это возможно в каком направлении двигацо... этот ли
>оператор цикла оптимален для этой задачи?
>Заранее спасибо.
>
>З.Ы: ногами пролшу сильно не пинать.. перывае 2 часа сижу за sh...

Если код делает то что надо, значит ошибок нет и задача решена.
Критерии оптимальности не заданы, обратись к лекциям.


"Бесконечный цикл в SH"
Отправлено Daert , 16-Мрт-09 19:43 
>[оверквотинг удален]
>>
>>Укажите ошибки, и если это возможно в каком направлении двигацо... этот ли
>>оператор цикла оптимален для этой задачи?
>>Заранее спасибо.
>>
>>З.Ы: ногами пролшу сильно не пинать.. перывае 2 часа сижу за sh...
>
>Если код делает то что надо, значит ошибок нет и задача решена.
>
>Критерии оптимальности не заданы, обратись к лекциям.

проблема в том, что я не могу провкрить как работает этот скрипт, в силу того, что не имею под рукой юникс системы.. вот поэтому и спршиваю на форуме.. так то бы я понятное дело сам проверил...


"Бесконечный цикл в SH"
Отправлено ANF , 16-Мрт-09 20:30 
Считаем сколько ошибок в сообщении, при таком отношении и в скрипте будет тоже самое.
Без проверки и нечего даже мечтать о работоспособности.
VMWare легко ставится, также легко можно и небольшую Линукс OS поставить.
По скриптику - синтаксис и невнимательность.
Имя переменной одно, в цикле другое.
Команды между собой разделяются не запятой, а точкой с запятой.
Кавычки при выполнении команды и назначении значения переменной не те.
Пробелы при суммировании.
Итого имеем -

#!/bin/sh
i=1
while true
do
echo $i; sleep 1
i=`expr $i + 1`
done

Если желаем писать проги в будущем - учимся быть во всём внимательным.


"Бесконечный цикл в SH"
Отправлено Pahanivo , 17-Мрт-09 08:47 
>[оверквотинг удален]
>#!/bin/sh
>i=1
>while true
>do
>echo $i; sleep 1
>i=`expr $i + 1`
>done
>
>Если желаем писать проги в будущем - учимся быть во всём внимательным.
>

этот цикл может быть только псевдо-бесконечным ))
ибо данные (переменная) имеют ограниченную разрядность ))
некоректная задача. надо как минимум еще проверять допустимый максимум и обнулять счетчик.


"Бесконечный цикл в SH"
Отправлено Andrey Mitrofanov , 17-Мрт-09 10:20 
>этот цикл может быть только псевдо-бесконечным ))
>ибо данные (переменная) имеют ограниченную разрядность ))
>некоректная задача. надо как минимум еще проверять допустимый максимум и обнулять счетчик.

"Немного" отодвинем предел:
echo 'for(i=0;1;i++) i' |bc |while read ii; do echo "$ii"; sleep 1; done

И да, решение несколько за рамками "постановки" - bc не часть шела... Где-то тут кто-то писал арифметику на шеле? Или там тоже bc был?..

С другой стороны по одной секунде много-то и не надо: уних-тайм с 70-го года не переполнился ешё. %)

ЗЫ: Задача: дождаться тепловой смерти Вселенной, выводя i+1 раз в секунду... На шеле, конечно же! ;)


"Бесконечный цикл в SH"
Отправлено Pahanivo , 17-Мрт-09 10:52 
>[оверквотинг удален]
>
>И да, решение несколько за рамками "постановки" - bc не часть шела...
>Где-то тут кто-то писал арифметику на шеле? Или там тоже bc
>был?..
>
>С другой стороны по одной секунде много-то и не надо: уних-тайм с
>70-го года не переполнился ешё. %)
>
>ЗЫ: Задача: дождаться тепловой смерти Вселенной, выводя i+1 раз в секунду... На
>шеле, конечно же! ;)

))) еще на два слишним раза (учитавая текущие колво сек эпохи) хватит 32-битного счетчика )))


"Бесконечный цикл в SH"
Отправлено const86 , 17-Мрт-09 11:50 
>>этот цикл может быть только псевдо-бесконечным ))
>>ибо данные (переменная) имеют ограниченную разрядность ))
>И да, решение несколько за рамками "постановки" - bc не часть шела... Где-то тут кто-то писал арифметику на шеле? Или там тоже bc был?..

Да всё равно упрётся в размер доступной памяти... Не судьба бесконечно единицу прибавлять :(


"Бесконечный цикл в SH"
Отправлено angra , 17-Мрт-09 15:08 
Ну так и в начальном скрипте expr это ни разу не часть шелла и его стоило бы заменить на $(($i+1)) :)


"конечный цикл в SH"
Отправлено Andrey Mitrofanov , 17-Мрт-09 15:29 
>Ну так и в начальном скрипте expr это ни разу не часть
>шелла и его стоило бы заменить на $(($i+1)) :)

А вдруг оно не совместимо с _его_ /bin/sh? В-) А с /bin/sh его препода -- так вообще "фиаско"...

Вот ещё башизм:
$ while((++i)); do echo $i; sleep 1; done
1
2
3
4
5
^C
$ _
Корректное :) завершение про Ctrl+C и переполнению - прилагаются.

Кстати, ближе к Смерти Вселенной вариант с bc станет "врать": выполнение read может занимать /заметно/ больше секунды... Когда и/или если +1 в bc начнёт тормозить. :D

PS: Гм, $) астрофизики в зале есть?
$ i=$((2**63-3+2**63)); while((++i)); do echo $i; done|time head -5
-2
-1
0.00user 0.00system 0:00.00elapsed 133%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+223minor)pagefaults 0swaps
$ _


"конечный цикл в SH"
Отправлено angra , 17-Мрт-09 15:40 
Ну да, вдруг там вместо /bin/sh бейсик :)
А вообще судя по http://www.freebsd.org/cgi/man.cgi?query=sh&format=html $((expr)) это не башизм.

"конченый цикл в SH"
Отправлено Andrey Mitrofanov , 17-Мрт-09 16:04 
>Ну да, вдруг там вместо /bin/sh бейсик :)

И он тоже умеет быть позикс шеллом??! P)

>А вообще судя по
>$((expr)) это не башизм.

Ну, наверное, я в dash и tcsh как-то не так ;/ пробовал, и надо было пойти и поставить pdksh, и зря поленился.


"конечный цикл в SH"
Отправлено 0dmin , 17-Мрт-09 21:04 
>Ну да, вдруг там вместо /bin/sh бейсик :)
>А вообще судя по http://www.freebsd.org/cgi/man.cgi?query=sh&format=html $((expr)) это не башизм.

Дык вроде Андрей не о $((expression)) говорил а о ((++i)) ... а оно башизм МАХРОВЫЙ :)

Вот это скопипасть в баш - работает, в позикс шелл - нет:
while((++i)); do echo $i; sleep 1; done

А чтобы заработало надо синтакс-шугар-фэйс-ДЕсургери сотворить:
i=0;while i=$(($i+1)); do echo $i; sleep 1; done

Как то так.


"конечный цикл в SH"
Отправлено vic , 17-Мрт-09 15:42 
while ((++i)) && echo $i && sleep 1; do continue; done

зы: главное чтобы попкорна хватило до холодца вселенной :)


"Бесконечный цикл в SH"
Отправлено n0mad , 30-Июн-10 23:54 
>Считаем сколько ошибок в сообщении, при таком отношении и в скрипте будет
>тоже самое.
>Без проверки и нечего даже мечтать о работоспособности.
>VMWare легко ставится, также легко можно и небольшую Линукс OS поставить.

Нафиг эти вари.... есть coLinux - дешево и сердито...


"Бесконечный цикл в SH"
Отправлено from_mars , 17-Мрт-09 08:08 
Поставь cygwin