Bash 如何将控制运算符| |和&;的命令组合在一起&;?

Bash 如何将控制运算符| |和&;的命令组合在一起&;?,bash,shell,Bash,Shell,我希望能够将命令组合在一起,以便在一组命令中的一个失败时,执行另一个命令,即 $ ping 1; echo 1 || echo 2 将返回相当于 $ ping 1; echo 2 结果 connect: Invalid argument 2 i、 e.前两个命令ping 1和echo 1应组合在一起,以便如果其中一个失败,将执行第三个echo 2 我试过的东西 $(ping 1;echo 1)| echo 2 $((ping 1;echo 1))| | echo 2 $[[ping 1

我希望能够将命令组合在一起,以便在一组命令中的一个失败时,执行另一个命令,即

$ ping 1; echo 1 || echo 2
将返回相当于

$ ping 1; echo 2
结果

connect: Invalid argument
2
i、 e.前两个命令
ping 1
echo 1
应组合在一起,以便如果其中一个失败,将执行第三个
echo 2


我试过的东西

  • $(ping 1;echo 1)| echo 2
  • $((ping 1;echo 1))| | echo 2
  • $[[ping 1;echo 1]| | echo 2
  • ${ping 1;echo 1;}| | echo 2
  • $eval“ping 1;echo 1”| | echo 2
  • $函数try_ping{ping 1;echo 1;};try_ping|echo 2

EDIT我仍然需要运行第一组中的所有命令,因此
&&
对我不起作用

  • 运行组1中的所有命令
  • 如果组1中的任何命令失败(不退出状态为零)
  • 然后运行第二组
  • 比如说,

    function my_ping {
        local exit=0
        command1
        exit=$(( exit + $? ))
        command2
        exit=$(( exit + $? ))
        if [[ "$exit" -ne "0" ]]; then
            command3
        fi
    }
    
    这个怎么样

    OK=1
    ping 1 || OK=0
    echo 1 || OK=0
    [[ "$OK" == "0" ]] && echo 2
    
    这个怎么样

    OK=1
    ping 1 || OK=0
    echo 1 || OK=0
    [[ "$OK" == "0" ]] && echo 2
    
    例如:

    ls && tree && echo success || echo epic fail
    
    如果命令
    ls
    tree
    失败,则会打印“epic fail”。

    示例:

    ls && tree && echo success || echo epic fail
    
    darby@darbycrash:~$ ping 1 2>/dev/null && echo 1 || echo 2
    2
    darby@darbycrash:~$
    
    如果命令
    ls
    tree
    失败,将打印“epic fail”

    darby@darbycrash:~$ ping 1 2>/dev/null && echo 1 || echo 2
    2
    darby@darbycrash:~$
    
    您可以同时使用&&来运行命令,如果其中一个失败,则链将断开。 这是您的示例,但已修复。 享受

    另外,我已将错误消息重定向到null

    编辑后更新

    darby@Debian:~/Scrivania$ bash ex
    Command "curl -sSL google.com" returned value 0
    Command "echo 1" returned value 0
    Command "ping localhost -c 1" returned value 0
    Command "ls" returned value 0
    Command "false" returned value 1
    I must run second group of commands because something have not worked!
    2
    darby@Debian:~/Scrivania$ bash ex
    Command "curl -sSL google.com" returned value 0
    Command "echo 1" returned value 0
    Command "ping localhost -c 1" returned value 0
    Command "ls" returned value 0
    Command "true" returned value 0 # I have changed false to true in the command array
    All is gone without issues! Goodbye darby!
    darby@Debian:~/Scrivania$ 
    
    此脚本运行第一个组的所有命令,如果有人退出而没有退出代码0,则设置一个变量,使用if运行第二个组,或提醒您不需要更多命令即可不运行任何内容:

    #!/bin/bash
    
    function check () {
        $1 >/dev/null 2>&1
        echo $?
    }
    
    command=("curl -sSL google.com" "echo 1" 'ping localhost -c 1' 'ls' 'false')
    
    for ((i=0;i<${#command[@]};i++)); do
        echo "Command \"${command[$i]}\" returned value $(check "${command[$i]}")"
        if (($(check "${command[$i]}") != 0)); then second=1; fi
    done
    
    if ((second == 1)); then
        echo "I must run second group of commands because something have not worked!"
        echo 2
    else
        echo "All is gone without issues! Goodbye $USER!"
        exit 0
    fi
    
    您可以同时使用&&来运行命令,如果其中一个失败,则链将断开。 这是您的示例,但已修复。 享受

    另外,我已将错误消息重定向到null

    编辑后更新

    darby@Debian:~/Scrivania$ bash ex
    Command "curl -sSL google.com" returned value 0
    Command "echo 1" returned value 0
    Command "ping localhost -c 1" returned value 0
    Command "ls" returned value 0
    Command "false" returned value 1
    I must run second group of commands because something have not worked!
    2
    darby@Debian:~/Scrivania$ bash ex
    Command "curl -sSL google.com" returned value 0
    Command "echo 1" returned value 0
    Command "ping localhost -c 1" returned value 0
    Command "ls" returned value 0
    Command "true" returned value 0 # I have changed false to true in the command array
    All is gone without issues! Goodbye darby!
    darby@Debian:~/Scrivania$ 
    
    此脚本运行第一个组的所有命令,如果有人退出而没有退出代码0,则设置一个变量,使用if运行第二个组,或提醒您不需要更多命令即可不运行任何内容:

    #!/bin/bash
    
    function check () {
        $1 >/dev/null 2>&1
        echo $?
    }
    
    command=("curl -sSL google.com" "echo 1" 'ping localhost -c 1' 'ls' 'false')
    
    for ((i=0;i<${#command[@]};i++)); do
        echo "Command \"${command[$i]}\" returned value $(check "${command[$i]}")"
        if (($(check "${command[$i]}") != 0)); then second=1; fi
    done
    
    if ((second == 1)); then
        echo "I must run second group of commands because something have not worked!"
        echo 2
    else
        echo "All is gone without issues! Goodbye $USER!"
        exit 0
    fi
    

    当您编写
    ping 1
    时,您的意思是仅作为示例吗?“无效参数”来自ping。@dbalakirev是的,它只是一个示例。当您编写
    ping 1
    时,您的意思是仅作为示例吗?“无效参数”是ping发出的。@dbalakirev是的,这只是一个示例。我需要第二个命令运行,即使第一个命令失败。很抱歉,措辞含糊不清,我已更新以澄清我的答案。我已更新了我的代码。我希望这能帮到你。;)我需要第二个命令运行,即使第一个命令失败。很抱歉措辞含糊不清,我已更新为clar通知我的答案。我已经更新了我的代码。我希望这能对你有所帮助。;)我需要第二个命令来运行,即使第一个失败。很抱歉,措辞含糊不清,我已经更新以澄清我的答案。我需要第二个命令来运行,即使第一个失败。很抱歉措辞含糊不清,我已经更新以澄清我的答案。