2016-12-24 92 views
1

我写这所有的地方:如何模仿C++'X = X && F()`在bash

if (($x == 0)) ; then 
    mycommand 
    x=$? 
fi 

有没有更简单/简短的方式与bash的短路&&做到这一点?

编辑: 我不关心$x的价值,除非它是零,即成功/失败。

回答

3

因此,变量x只是前一个命令的结果?如果你的意思是你有一个像一系列连续的几乎相同的块:

if (($x == 0)) ; then my_command_1; x=$?; fi 
.... 
if (($x == 0)) ; then my_command_N; x=$?; fi 

然后,只需结合您的命令,这样

my_command_1 \ 
&& ... \ 
&& my_command_N 

[更新]

在另一方面,如果命令分散在整个脚本中,我会这样做:

x=true 
$x && my_command_1 || x=false 
... 
$x && my_command_2 || x=false 

或者更多discree T:

$do my_command_1 || do=: 
... 
$do my_command_2 || do=: 

,或者更可能的是,通过一个函数:

function check_and_do { [ -z "$failed" ] && "[email protected]" || failed=ouch; } 

check_and_do my_command_1 
.... 
check_and_do my_command_2 
+0

的命令出现在许多不同的地方和范围。没有像这样连续的继承。 – Museful

+0

什么是'$ do my_command ||做=:'? '$ do'如何决定'my_command'是否执行? – Museful

+1

@Museful'do'要么是未定义的,要么'$ do'计算为nothing =>您的命令运行;或'do'在出错后被赋予':'值,'$ do'赋值为空命令':'(它的参数,即你的命令被忽略)。 – xhienne

4
((x == 0)) && { mycommand; x=$?; } 
  • 里面((...))你一般不需要用$前缀变量。

  • { ... }是一个组命令,允许您作为一个单元执行多个命令,在这种情况下,作为RHS的&&运营商。
    请注意,需要终止{ ... }中的最后一个命令,其中;(单线形式)。


一般来说,可以直接与&&(逻辑AND)和||(逻辑OR),但要注意这些(短路)经营者链命令等于优先(并像往常一样是左联合的)。

cmd1 && cmd2 && ... || cmdElse # first failing command triggers cmdElse 

意味着cmd1无条件地执行,并且,如果成功(退出代码0),所有后续的命令执行,只要它们也取得成功。
第一个失败的命令(非零退出代码),如果有的话,触发||子句。

如果相反,你想的||条款限制在一个特定的命令,使用一组命令:

cmd1 && { cmd2 || cmd2Else; } # cmd2Else only executes if cmd2 gets to execute and fails 

现在,如果cmd2得到执行所有与失败cmdElse才会调用。

为了说明相等优先级的行为:

cmd1 || cmd2 && cmd3 # conceptually: (cmd1 || cmd2) && cmd3 

cmd1无条件地执行,并且如果失败,则执行cmd2。如果或者成功,则执行cmd3
如果两者都失败,cmd3永远不会执行。