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

埃里克

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章