我正在尝试获取在 Bashwhile
循环的“条件”部分中重复调用的函数的退出代码:
while <function>; do
<stuff>
done
当此循环因错误而终止时,我需要<function>
. 关于我如何得到它的任何想法?
我正在尝试获取在 Bashwhile
循环的“条件”部分中重复调用的函数的退出代码:
while <function>; do
<stuff>
done
当此循环因错误而终止时,我需要<function>
. 关于我如何得到它的任何想法?
您可以从条件中捕获退出值并向前传播:
输出
在这种情况下,退出状态
rmdir FOO
已在变量中捕获,ss
并且是1
。(尝试用 替换rmdir FOO
。( exit 4 )
你会发现ss=4
。)这是如何运作的?请记住,语法实际上是
while list-1; do list-2; done
,而不是更常见的预期while command; do list; done
。可以是一系列以分号分隔的list-1
命令,并且文档指出“只要列表中的最后一个命令返回退出状态为零,该while
命令就会连续执行列表list-2
list-1
。 ”作为看起来凌乱的
while
条件的替代表示,可以在表达式中分配一个变量(( ... ))
,然后使用结果。这给出了更难阅读但更紧凑的分配和测试结构:或者,您可以使用
while rmdir FOO; ! (( ss=$? ))
. 这些工作是因为 ((1)) 在算术上评估为 1,这通常与 true 相关联,因此该评估的退出代码为 0(成功)。另一方面, ((0)) 算术计算结果为 0,这通常与 false 相关联,因此该评估的退出代码为 1(失败)。这可能看起来令人困惑,因为毕竟两个评估((.))
都是“成功的”,但这是一种技巧,可以使表示真/假的算术表达式的值与 bash 的成功/失败退出代码保持一致,并制作条件表达式,如if ...; then ...; fi
,while ...; do ...; done
等,无论是基于退出代码还是算术值,都可以正常工作。一种方法是明确地进行测试,而不是将其委托给
while
. 因此,应该执行以下操作:在(先验无限)循环的开始,您将“手动”执行条件命令并存储退出代码,检查它,如果它不为零(表示失败),则退出循环。只有当它为零时,您才执行“实际”循环代码。
语法可以“压缩”,因为(如@roaima 所述)您可以在
(( ... ))
算术测试构造中进行变量赋值。创建一个包装函数,该函数使用函数退出代码的结果设置变量。例子:
使用
zsh
,您可以return
从匿名函数中使用:使用任何类似 Bourne 的 shell,您始终可以使用命名函数: