【问题标题】:Does KornShell (ksh) have a Do...While loop?KornShell (ksh) 是否有 Do...While 循环?
【发布时间】:2012-02-29 01:19:44
【问题描述】:

我的 KornShell (ksh) 脚本中有一个循环,我想至少执行一次,我想要一种优雅的方式来执行它,但是虽然我找到了很多关于如何编写 while 循环的资料,但似乎没有什么可以做的...while循环在那里。

我正在做的是从配置文件中读取以逗号分隔的文件列表并处理它们。如果文件列表为空,那么我要处理目录中的所有文件。

有什么好的方法可以做到这一点?

编辑:这是我目前拥有的。我抓取文件名,然后将其从字符串中删除以进行下一次传递。如果文件列表为空,我退出循环。但是,如果列表一开始是空的,我希望它仍然运行一次。

  while [[ -n "${FILES%%,*}" ]]; do
       FILE="${FILES%%,*}"                             
       FILES="${FILES#*,}"
  done

【问题讨论】:

  • 你有没有先用谷歌搜索? cyberciti.biz/faq/ksh-for-loop
  • 抱歉,ksh 中没有“Do ... while”。请考虑编辑您的问题,以包括迄今为止您在代码中的最佳通行证。当我们可以看到您正在使用的内容时,提供帮助会容易得多。祝你好运。
  • @shelter,一个普通的 while ... do ... 循环可以立即执行此操作。在别处查看我的答案。

标签: shell unix scripting ksh


【解决方案1】:

是的,ksh 中的标准 while 循环支持开箱即用:

while ...; do ...; done

标准的while循环有代码块beforeafterdo

每个块可能包含多个命令。通常我们只使用 第一个块的单个命令,其退出状态决定是否 循环终止或继续。

当我们使用多个命令时,只有 最后一个命令的状态很重要。

while
   echo do this always # replace with your code
   [[ -n "${FILES%%,*}" ]]
do
   FILE="${FILES%%,*}"                             
   FILES="${FILES#*,}"
done

【讨论】:

    【解决方案2】:

    你可以伪造它:

    do_once=true
    while $do_once || [[ other condition ]]; do
      : your stuff here
    
      do_once=false
    done
    

    【讨论】:

      【解决方案3】:

      ksh 中没有这样的结构。您可以在while true; do ... ; done 循环结束时通过break(或continue)模拟此操作。

      【讨论】:

      • 完美,不好意思我没想到。
      • 然而,构造存在。 while block1; condition; do block2; doneblock1 是总是被执行的代码。不需要breakcontinue
      猜你喜欢
      • 2010-11-02
      • 2010-09-13
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 2015-07-03
      • 1970-01-01
      相关资源
      最近更新 更多