繁体   English   中英

如何在Shell中延迟评估命令以进行循环

[英]How to lazy evaluate commands in a shell for loop

我想实现一个后备机制:如果一个命令失败,请尝试下一个或下一个(或下一个)。 可以有许多命令以相同的方式处理。 下面的实现(简化的错误处理应该更好,但这不是当前问题)在评估for循环内容之前运行所有命令。 我如何使它变得懒惰?

f() {
  for message in $(cmd0) $(cmd1) $(cmd2) # cmd1, cmd2 should evaluate lazily
  do
    if [ $? == 0 ]
    then
      echo "ok: $message"
      return # exit early
    fi
  done
  echo "error: $message"
}

假设您的命令cmd0cmd1在成功运行时返回0 ,而在失败时返回非零,您可以执行以下操作

f() {
    for cmd in cmd0 cmd1 cmd2; do
        if "$cmd"; then
            echo "ok: $message"
            return
        fi
    done
}

参见示例,运行命令truefalse分别返回代码01

f() {
    for cmd in false true; do
        echo "running command $cmd"
        if "$cmd"; then
            echo "ok: $message"
            return
        fi
    done
}

运行它,

f
running command false
running command true
ok:

你也可以做

f() { cmd0 || cmd1 || cmd2; }

仅当cmd0失败时才评估cmd1 ,仅在cmd0cmd1失败时才评估cmd2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM