每个bash测试执行多个语句的方法&&;陈述
有人知道在bash测试中执行多条语句的方法吗?因此,如果我使用:每个bash测试执行多个语句的方法&&;陈述,bash,Bash,有人知道在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"
[[ $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看到命令结束于;但是这不是我想要的
我尝试过分组、评估和函数,也有过失败和成功,但我真的只想把这项工作放在一行上。有人有什么想法吗 使用子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
考虑使用常规的IF-THEN-ELSE语句。在以下简单测试中使用&&和| |是合理的:
[[ -z "$PATH" ]] && echo 'Disaster, PATH is empty!' || echo 'Everything ok!'
<>但请考虑以下命令:
true && true && true && false && true || echo 'False!'
False!
或
无论何时返回非零退出状态,都会执行| |之后的命令。如您所见,即使是命令分组也没有帮助
子shell中的执行行为类似:
true && ( true; echo true; true; false ) || ( true; echo true; false )
true
true
如果需要适当的IF行为,只需使用常规IF即可。简单的命令分组应该可以;不过,语法可能有点棘手
[[ $Var = 1 ]] && { echo "yes-1"; echo "yes-2"; } || { echo "no-1"; echo "no-2"; }
需要注意的几点:
if-then-else
语句的建议bash
中导致分词,因此“{echo”是一个单词,{echo”是一个大括号,后跟单词“echo”是的,我发誓我试过类似的方法。我确实注意到你不需要在“no-2”回声后使用“;”来让它工作,但使用它不会有任何伤害,而且如果你将“()”改为“{}”,那么你就需要“;”。我为让我走上这条路而增加了你的计数。正如对“chepner”所说的那样在每个语句的末尾,无论是()子shell还是{}分组都会起作用!@pn1dude agree,我总是在子shell或分组中的所有命令末尾使用
;
,只是为了保持一致性(“特殊情况不足以打破规则”
:P).这次我没有这么做的唯一原因是因为我很忙,我复制/粘贴了你的代码,但我忘了:P我很高兴我帮了你,好luckI,我想我没能做到”;“在我的分组结束时,尝试一下,然后我就认为它不起作用了……但是是的,你让我再试一次。是的,这很有帮助,因为我厌倦了快速和肮脏的日志if语句。如果不需要分配/递增变量,Subshell是可以的,否则你必须使用chepner回答中的命令分组,因为来自Subshell的变量不会传回。谢谢,我尝试过类似的方法,但一定错过了第二个语句末尾的“;”。我给了您正确的答案,因为每个语句末尾的“;”使它可以与()子shell或{}一起工作在大多数情况下,命令分组更好。例如,如果您想在某个脚本失败时退出脚本,可以执行foocmd | |{echo foo failed;exit 1;}
它将打印诊断并退出。如果使用子shell进行分组,则只有子shell本身会退出,而不会退出scipt,这几乎肯定不是预期的效果。您可能是对的,但分组似乎确实有效。我通常使用If-else fi构造,但喜欢[[]的简短甜味&&||关于快速简单语句,有时我会涉及到2条语句,而if-else fi会占用大量代码来处理带有多条语句的快速肮脏的[[]]&&&| |。
[[ $Var = 1 ]] && { echo "yes-1"; echo "yes-2"; } || { echo "no-1"; echo "no-2"; }