在 中bash
,我有时想连续运行几个命令,但不想等它们完成后再输入新命令。所以我会这样做:
cmd1; cmd2; cmd3
不幸的是,其中一个命令可能会失败。在这种情况下,我想停止。有没有一种简单的方法可以做到这一点,但要使我仅在前一个命令的退出代码为 0 时才继续运行命令?
答案1
使用&&
运算符,
cmd1 && cmd2 && cmd3
在 shellscripting 中,&&
和||
运算符是根据 C 中逻辑运算符的优化实现建模的。&&
表示 AND 运算符,和||
表示 OR。Unix 与 C 紧密相关,在 C 中,如果已经从第一个操作数知道结果,则不会对逻辑运算符的第二个操作数进行求值。例如,"false && x"
对于false
任何x
,都不需要求值x
(尤其是如果x
是函数调用);对于 也是如此"true || x"
。这也称为短路语义。
在 Unix 中,传统上将命令的返回值解释为“成功完成”的真值:退出代码 0 表示true
(成功),非零表示false
(失败)。因此,当 中的第一个命令cmd1 && cmd2
返回"false"
(非零退出状态,表示失败)时,复合命令的状态是已知的:失败。因此 的整体解释cmd1 && cmd2
可能是:“执行cmd1
,然后,如果没有失败,cmd2
”。这正是您在问题中想要的。
与 OR 类似:cmd1 || cmd2
可以解释为“执行cmd1
,或者如果失败,cmd2
”。
专家提示:对于较长的链&&
,考虑放入set -e
在您的脚本中。它基本上将分号更改;
为&&
,但有几个特殊情况。
答案2
“链接命令并对其进行分组”
ping 192.168.0.1 || { echo "ping not successful"; exit 1; }
ping 仅当不成功时才执行括号中的链接命令组。
注意力:
该列表必须以“;”终止。
括号和分组命令之间必须有空格!
答案3
只需使用&&
操作员即可。例如:
cmd1 && cmd2 && cmd3
如果其中一个命令失败(返回除 0 以外的退出值),则其他命令将不会运行。