Bash条件命令

时间:2018-01-05 06:58:40

标签: bash conditional sh

如果上一个命令成功,我有一串我想要连续运行的命令。这是一个例子:

echo "hello" && sleep 5 && cd /tmp && rm -r * && echo "googbye"

如果任何部分失败,我需要知道哪部分失败了。此外,我正在尝试在命令运行时实现微调器。有没有办法做到这一点?

1 个答案:

答案 0 :(得分:0)

在检测哪个位失败方面,您可以使用:

bad=0
[[ $bad -eq 0 ]] && { echo hello   || bad=1; }
[[ $bad -eq 0 ]] && { sleep 5      || bad=2; }
[[ $bad -eq 0 ]] && { cd /tmp      || bad=3; }
[[ $bad -eq 0 ]] && { rm -r *      || bad=4; }
[[ $bad -eq 0 ]] && { echo goodbye || bad=5; }

然后将根据哪个位失败(如果有)来设置变量bad

或者,如果它太冗长,你仍然可以在一行中,虽然时间更长:

 bad=1 && echo hello && bad=2 && sleep 5 && bad=3 && cd /tmp && bad=4 && echo goodbye && bad=0

就微调器而言,如果你在你正在做的工作中确实有输出,那么这可能效果不是很好,但是你可以用一个简单的后台函数来完成:

spinner() {
    while : ; do
        echo -ne '\b|'  ; sleep 1
        echo -ne '\b/'  ; sleep 1
        echo -ne '\b-'  ; sleep 1
        echo -ne '\b\\' ; sleep 1
    done
}

echo -n 'Starting: .'
spinner & pid=$!
sleep 13 ; kill $pid
echo
echo Done.

关于根据您的问题和评论将所有内容放在一起,我可能有两个函数,第一个在后台运行微调器,第二个用于执行有效负载,包括捕获其输出,因此它不会影响微调器。

为此,请查看以下演示代码:

spinner() {
    echo -n 'Starting: .'
    chars='\-/|'
    while [[ -f "$1" ]] ; do
        echo -ne "\b${chars:3}" ; sleep 1
        chars="${chars:3}${chars:0:3}"
    done
    echo -e ' .. done.'
}

payload() {
    echo Running task 1
    sleep 3
    true || return 1

    echo Running task 2
    sleep 3
    false || return 2

    echo Running task 3
    sleep 3
    true || return 3

    return 0
}

touch /tmp/sentinel.$$
spinner /tmp/sentinel.$$ & pid=$!

payload >/tmp/out.$$ 2>&1 ; rc=$?

rm /tmp/sentinel.$$ ; wait

echo "Return code was $rc, output was:"
cat /tmp/out.$$
rm /tmp/out.$$

在有效负载功能中,只需将每个步骤替换为您希望实际执行的操作(例如关闭systemd作业或删除某些文件)。

现有代码将失败第2步(false)但是,对于您自己的代码,这将运行实际命令并评估其返回值。

我还使用了一个哨兵文件来终止微调器功能,这样它就不会被关闭"暴力"。