Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
每个bash测试执行多个语句的方法&&;陈述_Bash - Fatal编程技术网

每个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"

有人知道在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看到命令结束于;但是这不是我想要的

我尝试过分组、评估和函数,也有过失败和成功,但我真的只想把这项工作放在一行上。有人有什么想法吗

使用子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"; }
需要注意的几点:

  • 如果你做了更复杂的事情,请注意@tvm关于使用
    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"; }