我正在学习编写bash脚本。
我正在编写脚本来设置新服务器。
我应该如何测试脚本。
即 我对某些软件包(如apache,php等)使用apt install,然后出现两行错误。
然后我需要修复该错误并再次运行,但它将再次运行所有安装命令。
系统可能会说该软件包已经安装,但是如果有命令将字符串追加到文件中该怎么办。 如果再次运行它们,它将第二次将相同的字符串附加到文件中。
编写这样的bash脚本的最佳方法是什么?
您可以进行测试运行,以在错误或脚本结束后回滚所有内容吗?
或者让脚本在下次运行时从发生错误的行继续执行,甚至更好?
我正在Ubuntu 18.04服务器上执行此操作。
答案 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