我想实现一个后备机制:如果一个命令失败,请尝试下一个或下一个(或下一个)。可以有许多命令以相同的方式处理。下面的实现(简化的错误处理应该更好,但这不是当前问题)在评估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"
}
答案 0 :(得分:2)
假设您的命令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:
答案 1 :(得分:0)
您也可以只做
height=auto
仅在f() { cmd0 || cmd1 || cmd2; }
失败时才评估cmd1
,并且仅在cmd0
和cmd2
都失败时才评估cmd0
。