是否可以在终端命令模板循环中使用 && 运算符?

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)

Ste*_*itt 5

你可以使用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 退出(这仍然不如上面的 subshel​​l 方法好):

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或类似的东西。