У меня проблема с ksh в том, что цикл while не подчиняется условию «while». Теперь я должен добавить, что это ksh88 в ящике Solaris моего клиента. (Это отдельная проблема, которая не может быть решена на этом форуме.;) Я видел Lance's question и некоторые подобные, но ни один из них, которые я нашел, по-видимому, не затрагивает этого. (Отказ от ответственности: НЕТ Я не смотрел на каждый КШ вопрос в этом форуме)while [[condition]] stalls on loop exit
Вот очень вырубить кусок кода, который воспроизводит проблему:
1 #!/usr/bin/ksh
2 #
3 go=1
4 set -x
5 tail -0f loop-test.txt | while [[ $go -eq 1 ]]
6 do
7 read lbuff
8 set $lbuff
9 nwords=$#
10 printf "Line has %d words <%s>\n" $nwords "${lbuff}"
11 if [[ "${lbuff}" = "0" ]]
12 then
13 printf "Line consists of %s; time to absquatulate\n" $lbuff
14 go=0 # Violate the WHILE condition to get out of loop
15 fi
16 done
17 printf "\nLooks like I've fallen out of the loop\n"
18 exit 0
Как я проверить это:
- Run loop-test.sh в фоновом режиме
- в другом окне я бегу команды, как «эхо какой-то бред >> loop_test.txt» (без кавычек, конечно)
- Когда я ИСВ h для выхода, я печатаю «echo 0 >> loop-test.txt»
Что происходит? Он действительно устанавливает go = 0 и отображает строку:
Линия состоит из 0; время, чтобы абсцитировать
, но не выходит из цикла. Чтобы разразиться, я добавляю еще одну строку в txt-файл. Цикл НЕ обрабатывает эту строку и просто выпадает из цикла, выдавая это «выпавшее» сообщение перед выходом.
Что происходит с этим? Я не хочу использовать «break», потому что в реальном скрипте цикл отслеживает журнал механизма базы данных, а флаг устанавливается, когда он видит сообщения, которые отключает двигатель. Фактический скрипт должен обрабатывать эти окончательные строки перед выходом.
Открыт для идей, кто-нибудь?
Большое спасибо!
- J.
Не уверен, что я действительно понимаю проблему (время для меня, чтобы Гото спать ;-), но бы использовать 'continue' вместо' break' получить вам что-нибудь? ИЛИ подавать 'tail -f' вывод в эквивалентную программу' awk'? Я не понимаю 'set $ lbuff' Какие значения будут отображаться в' $ lbuff'? ИЛИ Вы можете пометить это с помощью '[bash]' и получить гораздо больше глаз на проблему. Я не думаю, что здесь есть эксклюзивный код ksh. Если завтра это не будет, я буду экспериментировать. Удачи. – shellter
Шелтер, «набор $ lbuff» предназначен для создания выходных «n слов». Я хотел, чтобы моя петля сделала что-то *, кроме просто тупо прочитанных строк. – Jake
О, да, также нужно знать вывод 'echo KSH_Version = $ {. Sh.version}; uname -a'. Пожалуйста, внесите изменения в свой вопрос. Ночь ;-) Удачи. – shellter