如何延迟评估 shell for 循环中的命令

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 return 0 成功 运行 和非零失败你可以做

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

查看示例 运行ning 命令,truefalse return 分别编码 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