我有一个简单的 bash 脚本,它应该从数据库创建一个转储文件
docker exec -i container sh -c "mongodump --archive" > \
~/dumps/db-$(date + "%d%m%Y").dump 2> \
~/logs/dumps/db-$(date + "%d%m%Y").log \
我被要求确保脚本可以处理任何错误,因此我尝试将以下内容添加到脚本中。
docker exec -i container sh -c "mongodump --archive" > \
~/dumps/db-$(date + "%d%m%Y").dump 2> \
~/logs/dumps/db-$(date + "%d%m%Y").log \
exit_status=$?
if [ exit_status -ne 0 ]; then
echo "An error occured while running mongodump. Exit Status: $exit_status"
fi
以上是我的尝试。如果退出状态不是 0,则发送带有实际退出代码的回显消息。脚本成功创建了转储文件,但我收到以下错误:
[: exit_status: integer expression expected
我的假设是,由于我的日志重定向,命令本身实际上不会在完成时报告退出状态。但我不太确定。我仍在学习 Bash 脚本的诀窍,因此任何建议都值得赞赏。
问题是,您在 上结束了命令
\
,这表明命令将在下一行继续。在第一个代码片段中,这样做是可行的,因为除了文件结尾之外,后面什么都没有。但是,现在您添加了更多内容,原来的语法错误又回来找您了,您实际运行的命令已变成(删除细节以显示结构):这就是为什么这个简单的脚本会重现您的错误:
运行结果为:
因为
exit_status=$?
是作为上一个命令的一部分运行的,这意味着它只是作为另一个参数传递给你的docker
命令。你运行了docker ... exit_status=$?
。这意味着它从未作为变量赋值运行,因此变量exit_status
未在你的环境中设置。由于未设置,因此你会收到该错误。这与你使用任何随机的、不存在的变量名时得到的错误相同。例如:\
只需从脚本中删除尾随部分,它就会起作用:或者,由于您实际上不需要变量,因此可以简化(并修正拼写)为:
甚至只是: