Задание такое:
Написать бесконечный цикл, который будет раз в секунду выводить постоянно увеличивающееся число (1, 2, 3, 4 ...).вот что я наваял
#!/bin/sh
i=1
while true
do
echo $1, sleep 1
i = 'expr $1+1'
doneУкажите ошибки, и если это возможно в каком направлении двигацо... этот ли оператор цикла оптимален для этой задачи?
Заранее спасибо.З.Ы: ногами пролшу сильно не пинать.. перывае 2 часа сижу за sh...
>[оверквотинг удален]
>do
>echo $1, sleep 1
>i = 'expr $1+1'
>done
>
>Укажите ошибки, и если это возможно в каком направлении двигацо... этот ли
>оператор цикла оптимален для этой задачи?
>Заранее спасибо.
>
>З.Ы: ногами пролшу сильно не пинать.. перывае 2 часа сижу за sh...Если код делает то что надо, значит ошибок нет и задача решена.
Критерии оптимальности не заданы, обратись к лекциям.
>[оверквотинг удален]
>>
>>Укажите ошибки, и если это возможно в каком направлении двигацо... этот ли
>>оператор цикла оптимален для этой задачи?
>>Заранее спасибо.
>>
>>З.Ы: ногами пролшу сильно не пинать.. перывае 2 часа сижу за sh...
>
>Если код делает то что надо, значит ошибок нет и задача решена.
>
>Критерии оптимальности не заданы, обратись к лекциям.проблема в том, что я не могу провкрить как работает этот скрипт, в силу того, что не имею под рукой юникс системы.. вот поэтому и спршиваю на форуме.. так то бы я понятное дело сам проверил...
Считаем сколько ошибок в сообщении, при таком отношении и в скрипте будет тоже самое.
Без проверки и нечего даже мечтать о работоспособности.
VMWare легко ставится, также легко можно и небольшую Линукс OS поставить.
По скриптику - синтаксис и невнимательность.
Имя переменной одно, в цикле другое.
Команды между собой разделяются не запятой, а точкой с запятой.
Кавычки при выполнении команды и назначении значения переменной не те.
Пробелы при суммировании.
Итого имеем -#!/bin/sh
i=1
while true
do
echo $i; sleep 1
i=`expr $i + 1`
doneЕсли желаем писать проги в будущем - учимся быть во всём внимательным.
>[оверквотинг удален]
>#!/bin/sh
>i=1
>while true
>do
>echo $i; sleep 1
>i=`expr $i + 1`
>done
>
>Если желаем писать проги в будущем - учимся быть во всём внимательным.
>этот цикл может быть только псевдо-бесконечным ))
ибо данные (переменная) имеют ограниченную разрядность ))
некоректная задача. надо как минимум еще проверять допустимый максимум и обнулять счетчик.
>этот цикл может быть только псевдо-бесконечным ))
>ибо данные (переменная) имеют ограниченную разрядность ))
>некоректная задача. надо как минимум еще проверять допустимый максимум и обнулять счетчик."Немного" отодвинем предел:
echo 'for(i=0;1;i++) i' |bc |while read ii; do echo "$ii"; sleep 1; doneИ да, решение несколько за рамками "постановки" - bc не часть шела... Где-то тут кто-то писал арифметику на шеле? Или там тоже bc был?..
С другой стороны по одной секунде много-то и не надо: уних-тайм с 70-го года не переполнился ешё. %)
ЗЫ: Задача: дождаться тепловой смерти Вселенной, выводя i+1 раз в секунду... На шеле, конечно же! ;)
>[оверквотинг удален]
>
>И да, решение несколько за рамками "постановки" - bc не часть шела...
>Где-то тут кто-то писал арифметику на шеле? Или там тоже bc
>был?..
>
>С другой стороны по одной секунде много-то и не надо: уних-тайм с
>70-го года не переполнился ешё. %)
>
>ЗЫ: Задача: дождаться тепловой смерти Вселенной, выводя i+1 раз в секунду... На
>шеле, конечно же! ;)))) еще на два слишним раза (учитавая текущие колво сек эпохи) хватит 32-битного счетчика )))
>>этот цикл может быть только псевдо-бесконечным ))
>>ибо данные (переменная) имеют ограниченную разрядность ))
>И да, решение несколько за рамками "постановки" - bc не часть шела... Где-то тут кто-то писал арифметику на шеле? Или там тоже bc был?..Да всё равно упрётся в размер доступной памяти... Не судьба бесконечно единицу прибавлять :(
Ну так и в начальном скрипте expr это ни разу не часть шелла и его стоило бы заменить на $(($i+1)) :)
>Ну так и в начальном скрипте 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
$ _
Ну да, вдруг там вместо /bin/sh бейсик :)
А вообще судя по http://www.freebsd.org/cgi/man.cgi?query=sh&format=html $((expr)) это не башизм.
>Ну да, вдруг там вместо /bin/sh бейсик :)И он тоже умеет быть позикс шеллом??! P)
>А вообще судя по
>$((expr)) это не башизм.Ну, наверное, я в dash и tcsh как-то не так ;/ пробовал, и надо было пойти и поставить pdksh, и зря поленился.
>Ну да, вдруг там вместо /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Как то так.
while ((++i)) && echo $i && sleep 1; do continue; doneзы: главное чтобы попкорна хватило до холодца вселенной :)
>Считаем сколько ошибок в сообщении, при таком отношении и в скрипте будет
>тоже самое.
>Без проверки и нечего даже мечтать о работоспособности.
>VMWare легко ставится, также легко можно и небольшую Линукс OS поставить.Нафиг эти вари.... есть coLinux - дешево и сердито...
Поставь cygwin