而[[condition]]在循环退出时停止

时间:2015-11-17 02:33:08

标签: while-loop ksh

我遇到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

我测试的方式是:

  • 在后台模式下运行loop-test.sh
  • 在另一个窗口中,我运行的命令如“echo some nonsese&gt;&gt;&gt; loop_test.txt”(当然没有引号)
  • 当我想退出时,我输入“echo 0&gt;&gt; loop-test.txt”

会发生什么?它确实设置go = 0并显示以下行:

行由0组成;时间去绝望

但不退出循环。为了突破我向txt文件添加一行。循环不会处理该行,只是掉出循环,在退出之前发出“掉线”消息。

这是怎么回事?我不想使用“break”,因为在实际脚本中,循环正在监视数据库引擎的日志,并且当它看到引擎正在关闭的消息时设置标志。在退出之前,实际脚本仍必须处理这些最后一行。

开放给想法,任何人?

非常感谢!

- J。

2 个答案:

答案 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文档。

呃,还有一个问题:语法 在ksh中工作,甚至在模拟ksh93的mksh(在cygwin下)也没有。但 在bash中工作。所以我的老板会好好嘲笑我,因为他知道我不喜欢bash。

非常感谢,狗狗。

- J

答案 1 :(得分:0)

在明确表达问题并在其上休息之后,所述行为的原因告诉我:设置go=0后,循环的控制流仍然取决于另一行数据通过该管道从STDIN进入。

现在我已经意识到了奇怪的原因,我可以推测一种从流中读取的另一种方式。目前我正在考虑以下解决方案:

  • 打开输入文件为STDIN(需要研究exec语法)
  • 当条件发生时,关闭STDIN(再次,需要研究其语法)

然后在循环顶部使用更直观的while read lbuff是安全的。

我今天要测试一下并发布结果。我希望其他人从这个方法中受益(如果它有效)。