一种在每个bash test &&语句中执行多个语句的方法

pn1*_*ude 21 bash

有没有人知道在bash测试中执行多个语句的方法?所以,如果我使用:

[[ $Var = 1 ]] && echo "yes-1" || echo "no-1"
Run Code Online (Sandbox Code Playgroud)

然后设置Var=1输出是:yes-1
如果我设置Var=2然后输出是:no-1

这项工作正如我所料.但是,如果我尝试添加另一个语句来执行混合,它不起作用:

[[ $Var = 1 ]] && echo "yes-1";echo "yes-2" || echo "no-1";echo "no-2"
Run Code Online (Sandbox Code Playgroud)

当bash看到命令结束时,这是有道理的; 但是......这不是我想要的.

我已经尝试过分组和演绎和功能,并且已经失败并取得了成功,但我真的只想做的就是将这项工作放在一条线上.有人有主意吗?

che*_*ner 34

简单的命令分组应该工作; 但语法可能有点棘手.

[[ $Var = 1 ]] && { echo "yes-1"; echo "yes-2"; } || { echo "no-1"; echo "no-2"; }
Run Code Online (Sandbox Code Playgroud)

有几点需要注意:

  1. if-then-else如果你做任何更复杂的事情,请听@ tvm关于使用声明的建议.

  2. 大括号内的每个命令都需要用分号终止,即使是最后一个.

  3. 必须通过两侧的空格将每个支撑与周围文本分开.大括号不会导致单词中断bash,因此"{echo"是单个单词,"{echo"是大括号后跟单词"echo".


tvm*_*tvm 11

考虑使用常规的IF THEN ELSE语句.使用&&和|| 在简单的测试中是合理的,例如:

[[ -z "$PATH" ]] && echo 'Disaster, PATH is empty!' || echo 'Everything ok!'
Run Code Online (Sandbox Code Playgroud)

但是,请考虑以下命令:

true && true && true && false && true || echo 'False!'
False!
Run Code Online (Sandbox Code Playgroud)

要么

true && { echo true; false ; } || { echo false; true ; }
true
false
Run Code Online (Sandbox Code Playgroud)

无论何时返回非零退出状态,都在||之后执行命令 被执行.如您所见,即使命令分组也无济于事.

子shell中的执行行为类似:

true && ( true; echo true; true; false ) || ( true; echo true; false )
true
true
Run Code Online (Sandbox Code Playgroud)

如果您需要正确的IF行为,请使用常规IF.