我遇到ksh的问题,因为while循环无法遵守“while”条件。我现在应该在我的客户端Solaris盒子上添加ksh88。 (这是一个单独的问题,无法在这个论坛中解决。;)我看到Lance's question和一些相似但没有我发现似乎解决了这个问题。 (免责声明:不,我没有看过这个论坛中的每个ksh问题)
这是一段非常简洁的代码,可以复制问题:
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
我测试的方式是:
会发生什么?它确实设置go = 0并显示以下行:
行由0组成;时间去绝望
但不退出循环。为了突破我向txt文件添加一行。循环不会处理该行,只是掉出循环,在退出之前发出“掉线”消息。
这是怎么回事?我不想使用“break”,因为在实际脚本中,循环正在监视数据库引擎的日志,并且当它看到引擎正在关闭的消息时设置标志。在退出之前,实际脚本仍必须处理这些最后一行。
开放给想法,任何人?
非常感谢!
- J。
答案 0 :(得分:1)
好的, 非常快。在阅读了其他一些帖子之后,我发现了一个answer given by dogbane,它回避了我的整个管道计划。他是一个问题的第二个答案(从2013年开始),我看到neeraj正在使用我正在使用的相同方案。
出了什么问题? pipe-to-while始终适用于将要结束的输入,例如文件或具有输出结尾的命令。但是,从metastore'
2015-11-16T21:42:35.849278+00:00 app[web.1]: /app/vendor/bundle/ruby/2.0.0/gems/rack-ssl-1.4.1/lib/rack/ssl.rb:27:in
命令,没有明显的EOF。因此,子shell中的while不知道何时终止。
Dogbane的解决方案:不要使用烟斗。将他的逻辑应用于我的情况,基本循环是:
css
没有子shell,没问题。
关于该语法的警告:两者之间必须有空格&lt;运营商;否则它看起来像一个语法错误的HEREIS文档。
呃,还有一个问题:语法
非常感谢,狗狗。
- J
答案 1 :(得分:0)
在明确表达问题并在其上休息之后,所述行为的原因告诉我:设置go=0
后,循环的控制流仍然取决于另一行数据通过该管道从STDIN进入。
现在我已经意识到了奇怪的原因,我可以推测一种从流中读取的另一种方式。目前我正在考虑以下解决方案:
然后在循环顶部使用更直观的while read lbuff
是安全的。
我今天要测试一下并发布结果。我希望其他人从这个方法中受益(如果它有效)。