jav*_*web 3 shell control-flow for exit-status
我想让一个类似清晰命令的列表更清晰易读,所以我做了一个小终端循环
for what in \
cache \
thumbs \
; do my template $what:clear; done
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但是我想达到
my template cache:clear && my template thumbs:clear
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以轻松而明确地将&&放入这样的循环中,而无需将 if/else 语句添加到循环体检查最后一个命令退出代码并在非 0 时调用 break 的复杂性?
如果条件对你来说足够了:
for what in \
cache \
thumbs \
; do
my template $what:clear;
if [ $? -ne 0 ]; then break; fi \
; done
Run Code Online (Sandbox Code Playgroud)
你可以使用set -e
:
(set -e;
for what in \
cache \
thumbs;
do my template $what:clear; done)
Run Code Online (Sandbox Code Playgroud)
set -e
当命令以非零退出代码退出时,会导致 shell 退出,并且不会以其他方式处理失败。在上面,如果my ...
失败,则整个子shell退出,子shell的退出代码是失败命令的退出代码。这适用于 shell 脚本和命令行。
另一种方法是使用析取:
for what in \
cache \
thumbs; do
my template $what:clear || break
done
Run Code Online (Sandbox Code Playgroud)
这样做的缺点是需要|| break
在每个命令之后,并且吞下指示失败的退出代码;该for
循环会以零退出代码每次退出。您可以通过使break
失败来避免这种情况,这将导致for
循环以退出代码 1 退出(这仍然不如上面的 subshell 方法好):
for what in \
cache \
thumbs; do
my template $what:clear || break -1 2>/dev/null
done
Run Code Online (Sandbox Code Playgroud)
(break -1
导致break
以非零退出代码退出,并2>/dev/null
丢弃其错误消息)。
据我所知,您不能用于&&
退出循环,例如 in&& done
或类似的东西。
归档时间: |
|
查看次数: |
158 次 |
最近记录: |