24

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

[[ $Var = 1 ]] && echo "yes-1" || echo "no-1"

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

这项工作正如我所料。但是,如果我尝试添加另一个语句以在混合中执行并且它不起作用:

[[ $Var = 1 ]] && echo "yes-1";echo "yes-2" || echo "no-1";echo "no-2"

这是有道理的,因为 bash 看到命令结束于;但是……这不是我想要的。

我已经尝试过分组、评估和功能,并且有过失败和成功,但我真正想做的就是将这项工作放在一条线上。有人有想法么?

4

3 回答 3

43

简单的命令分组应该可以工作;虽然语法可能有点棘手。

[[ $Var = 1 ]] && { echo "yes-1"; echo "yes-2"; } || { echo "no-1"; echo "no-2"; }

需要注意的几点:

  1. if-then-else如果您做任何更复杂的事情,请注意@tvm 关于使用语句的建议。

  2. 大括号内的每个命令都需要以分号结尾,即使是最后一个。

  3. 每个大括号必须在两边用空格与周围的文本隔开。大括号不会导致单词中断bash,因此“{echo”是一个单词,“{ echo”是一个大括号后跟“echo”这个词。

于 2012-06-14T19:16:04.373 回答
12

考虑使用常规的 IF THEN ELSE 语句。&& 和 || 的使用 在这样的简单测试中是合理的:

[[ -z "$PATH" ]] && echo 'Disaster, PATH is empty!' || echo 'Everything ok!'

但是,请考虑以下命令:

true && true && true && false && true || echo 'False!'
False!

或者

true && { echo true; false ; } || { echo false; true ; }
true
false

任何时候返回非零退出状态,|| 之后的命令 被执行。如您所见,即使是命令分组也无济于事。

subshel​​l 中的执行行为类似:

true && ( true; echo true; true; false ) || ( true; echo true; false )
true
true

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

于 2012-06-14T18:49:14.420 回答
2

使用子shell:

$ Var=1; [[ $Var = 1 ]] && ( echo "yes-1";echo "yes-2" ) || ( echo "no-1";echo "no-2"; )
yes-1
yes-2

$ Var=2; [[ $Var = 1 ]] && ( echo "yes-1";echo "yes-2" ) || ( echo "no-1";echo "no-2"; )
no-1
no-2
于 2012-06-14T18:25:12.067 回答