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(?)
我之所以使用链,是因为在没有任何脚本文件的情况下运行单个dockerrun
命令的环境限制
我之所以使用链,是因为在没有任何脚本文件的情况下运行单个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