测试服务器设置bash脚本

时间:2019-01-29 06:07:16

标签: bash ubuntu-18.04

我正在学习编写bash脚本。

我正在编写脚本来设置新服务器。

我应该如何测试脚本。

即 我对某些软件包(如apache,php等)使用apt install,然后出现两行错误。

然后我需要修复该错误并再次运行,但它将再次运行所有安装命令。

系统可能会说该软件包已经安装,但是如果有命令将字符串追加到文件中该怎么办。 如果再次运行它们,它将第二次将相同的字符串附加到文件中。

编写这样的bash脚本的最佳方法是什么?

您可以进行测试运行,以在错误或脚本结束后回滚所有内容吗?

或者让脚本在下次运行时从发生错误的行继续执行,甚至更好?

我正在Ubuntu 18.04服务器上执行此操作。

1 个答案:

答案 0 :(得分:0)

这取决于您希望阅读它有多清晰,但是

[ -f .step01-done ] || your install command && touch .step01-done

[ -f .step02-done ] || your other install command && touch .step02-done

也许更容易阅读:

if ! [ -f .step01-done ]; then
    if your install command ; then
        touch .step01-done
    fi
fi

if ! [ -f .step02-done ]; then
    if your other install command ; then
        touch .step02-done
    fi
fi

...或者介于两者之间。

现在,我建议在某个位置创建一个目录,然后也许将命令的输出记录到该目录中的某个文件中(也许可以将其录入),但是绝对可以将您正在创建的所有这些文件放在此处。这样,如果您意外地从另一个目录启动它,那就没关系了。您只需要确保apt-get或您使用的实际值在失败时返回false。应该。

您甚至可以创建一个功能很好的函数...

#!/bin/bash

function do_cmd() {
    if [ -f "$1.done" ]; then
        echo "$2: skipping already completed step"
        return 0
    fi
    echo -n "$2: "
    $3 1> "$1.out" 2> "$1.err"
    if $?; then
        echo "ok"
        touch "$1.done"
        return 0
    else
        echo "failed"
        echo -e "see \"$1.out\" and/or \"$1.err\" for details."
        return 1
        # could "exit 1" instead
    fi
}

[ -d /root/mysetup ] || mkdir /root/mysetup
if ! [ -d /root/mysetup ]; then
    echo "failed to find or create /root/mysetup directory
    exit 1
fi

cd /root/mysetup

# ---------------- your steps go here -------------------
do_cmd prog1 "installing prog1" "apt-get install prog1" || exit 1
do_cmd prog2 "installing prog2" "apt-get install prog2" || exit 1
do_cmd startfoo "starting foo service" "service foo start" || exit 1

echo "all setup functions finished."

您将使用:

do_cmd identifier "description" "command or function"

说明

identifier: unique identifier used when files are generated:  
    identifier.out: standard output from command  
    identifier.err: standard error from command  
    identifier.done: created when command is successful  

description: this is actually printed to the terminal when the step is being executed.

command or function: this is the actual command to run

不确定为什么stackoverflow迫使我将最后一位格式化为代码,但带有w / e