Bash 根据命令链中的条件退出中间命令

Bash 根据命令链中的条件退出中间命令,bash,shell,sh,Bash,Shell,Sh,我有一长串bash命令: cmd_1 && \ cmd_2 && \ cmd_3 && \ ... cmd_k && \ ... cmd_n 如果这些命令中的任何一个失败,我希望整个链都失败。我在默认的shell行为中得到了这一点。但是,我想特别允许cmd_k失败,如果失败,我想退出0 我试着用 ... (cmd_k || exit 0) && \ ... 但是,它不会从主命令链退出,只会从子shell(?) 我

我有一长串
bash
命令:

cmd_1 && \
cmd_2 && \
cmd_3 && \
...
cmd_k && \
...
cmd_n
如果这些命令中的任何一个失败,我希望整个链都失败。我在默认的shell行为中得到了这一点。但是,我想特别允许
cmd_k
失败,如果失败,我想
退出0

我试着用

...
(cmd_k || exit 0) && \
...
但是,它不会从主命令链退出,只会从子shell(?)

我之所以使用链,是因为在没有任何脚本文件的情况下运行单个docker
run
命令的环境限制

我之所以使用链,是因为在没有任何脚本文件的情况下运行单个docker run命令的环境限制

相应地

docker run[OPTIONS]IMAGE[COMMAND][ARG…]

您可以通过调用内联shell脚本来运行一系列命令

bash
作为
[COMMAND]
,而
-c'内联脚本'
作为
[ARG…]

例如:

docker run--health cmd image\u foo bash-c'cmd\u 1;cmd_2。。。;cmd_j;cmd_k;:'
最后一个
是一个始终为true的命令,因此它将确保内联bash脚本始终以状态0退出(与
退出0
相同)

作为一个简单的逻辑问题,运行一系列命令并退出
exit 0

#/usr/bin/env bash
#如果,那么
如果!{true&&true&&true&&true&&true;};然后
退出0#将不会退出
fi
如果!{true&&true&&&&false;};然后
退出0#将退出
fi
如果!没错!没错!没错!是的;然后
退出0#将不会退出
fi
如果!没错!错!没错!是的;然后
退出0#将退出
fi
#仅使用逻辑运算符
! {true&&true&&true&&true;}&&exit 0#将不会退出
! {false&&true&&true&&true;}&&exit 0#将退出
{!真| |!真| |!真| |!真|}&&exit 0#将不会退出
{!真| | |!真| |!假| | |!真|&&exit 0#将退出
true
false
是成功或失败的命令的占位符

具有错误陷阱的其他解决方案:

#/usr/bin/env bash
陷阱“退出0”错误#出现错误时退出0
正确#命令成功
正确#命令成功
正确#命令成功
false#将触发错误陷阱并退出0
正确#命令成功
正确#命令成功
实施示例:

#/usr/bin/env bash
i=0
! {
{echo$(++i));true;}&&
{echo$(++i));true;}&&
{echo$(++i));false;}&&&#将在i=3处停止
{echo$(++i));true;}&&
{echo$(++i));true;}
}&退出0
输出:

1
2.
3.
我之所以使用链,是因为在没有任何脚本文件的情况下运行单个docker run命令的环境限制

相应地

docker run[OPTIONS]IMAGE[COMMAND][ARG…]

您可以通过调用内联shell脚本来运行一系列命令

bash
作为
[COMMAND]
,而
-c'内联脚本'
作为
[ARG…]

例如:

docker run--health cmd image\u foo bash-c'cmd\u 1;cmd_2。。。;cmd_j;cmd_k;:'
最后一个
是一个始终为true的命令,因此它将确保内联bash脚本始终以状态0退出(与
退出0
相同)

作为一个简单的逻辑问题,运行一系列命令并退出
exit 0

#/usr/bin/env bash
#如果,那么
如果!{true&&true&&true&&true&&true;};然后
退出0#将不会退出
fi
如果!{true&&true&&&&false;};然后
退出0#将退出
fi
如果!没错!没错!没错!是的;然后
退出0#将不会退出
fi
如果!没错!错!没错!是的;然后
退出0#将退出
fi
#仅使用逻辑运算符
! {true&&true&&true&&true;}&&exit 0#将不会退出
! {false&&true&&true&&true;}&&exit 0#将退出
{!真| |!真| |!真| |!真|}&&exit 0#将不会退出
{!真| | |!真| |!假| | |!真|&&exit 0#将退出
true
false
是成功或失败的命令的占位符

具有错误陷阱的其他解决方案:

#/usr/bin/env bash
陷阱“退出0”错误#出现错误时退出0
正确#命令成功
正确#命令成功
正确#命令成功
false#将触发错误陷阱并退出0
正确#命令成功
正确#命令成功
实施示例:

#/usr/bin/env bash
i=0
! {
{echo$(++i));true;}&&
{echo$(++i));true;}&&
{echo$(++i));false;}&&&#将在i=3处停止
{echo$(++i));true;}&&
{echo$(++i));true;}
}&退出0
输出:

1
2.
3.
退出括号内的子shell,然后(因为子shell成功)运行
true
。如果正如您所说,您不关心
cmd_k
是否成功,您只需要

cmd_k; true
退出括号内的子shell,然后(因为子shell成功)运行
true
。如果正如您所说,您不关心
cmd_k
是否成功,您只需要

cmd_k; true

离题:在
&&
之后,不需要对换行符进行``转义。
true&&((a==1))| |退出0并回显“OK”。
?使用
a=1
打印
OK
,使用
a=2
退出脚本。我认为问题在于,当
cmd_1
失败时,此解决方案也会存在,可能会将此添加到问题中。如果要允许它失败,为什么要将
&&
放在
cmd_k
之后?无论如何,这看起来你应该探索
set-e
。脱离主题:在
&&
之后,你不需要一个“\`转义换行符。
true&((a==1))|退出0&&echo“OK”有什么问题吗?
?当
a=1时
正常
为p