簡體   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