Bash 如何在shell for循环中惰性地计算命令

Bash 如何在shell for循环中惰性地计算命令,bash,shell,lazy-evaluation,Bash,Shell,Lazy Evaluation,我想实现一种回退机制:如果一个命令失败,请尝试下一个或下一个(或下一个)。可以以相同的方式处理任意数量的命令。下面的实现(简化,错误处理应该更好,但这不是当前的问题)在评估for循环内容之前运行所有命令。我怎样才能让它变懒 f() { for message in $(cmd0) $(cmd1) $(cmd2) # cmd1, cmd2 should evaluate lazily do if [ $? == 0 ] then echo "ok: $messa

我想实现一种回退机制:如果一个命令失败,请尝试下一个或下一个(或下一个)。可以以相同的方式处理任意数量的命令。下面的实现(简化,错误处理应该更好,但这不是当前的问题)在评估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"
}

假设您的命令,
cmd0
cmd1
在成功运行时返回
0
,在失败时返回非零,您只需执行以下操作即可

f() {
    for cmd in cmd0 cmd1 cmd2; do
        if "$cmd"; then
            echo "ok: $message"
            return
        fi
    done
}
请参见运行命令的示例,
true
false
,它们分别返回代码
0
1

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
进行计算;仅当
cmd0
cmd1
都失败时,才会对
cmd2
进行计算