gpt4 book ai didi

linux - 我的第一个 bash 脚本中的错误处理问题

转载 作者:太空宇宙 更新时间:2023-11-04 09:20:35 25 4
gpt4 key购买 nike

好的,所以我完全是 bash 脚本的初学者,我知道这个问题的措辞可能有点笨拙,但我会尽可能说清楚!

我编写了以下脚本来在文件夹中创建存储库备份。脚本如下:

#!/bin/bash

SVNREPO="/var/svn"
TEMP="/var/tmp"
BACKUP="/home/helix/backups"

cd $SVNREPO

if [ $# -eq 0 ]; then
for REPO in *; do
ARRAY+=($REPO)
done
else
for REPO in $@; do
ARRAY+=($REPO)
done
fi

for REPO in ${ARRAY[@]}; do
svnadmin dump $SVNREPO/$REPO -r HEAD | gzip > $TEMP/$REPO.svn.gzip sd
cp $TEMP/$REPO.svn.gzip $BACKUP/$REPO.svn.gzip
rm $TEMP/$REPO.svn.gzip
done

当不带参数调用脚本时,此脚本成功生成“var/svn”中所有存储库的 .gzip 备份,并创建作为参数调用的特定存储库的 .gzip 备份。太棒了!

但是,如果脚本运行时使用的参数与存在的存储库不对应,则程序将崩溃并显示错误消息:svnadmin: E000002: 无法打开文件 '/var/svn/ada/format': 没有那个文件或目录。我想要实现的是捕获此错误并将更用户友好的输出打印到控制台。我一直在尝试使用“陷阱”来做到这一点。

首先我添加了以下行:

trap 'echo ERROR! The repository or repositories that you are trying to backup do not exist!' ERR

...然后我在最后的 for 循环中将错误推送到/dev/null:

svnadmin dump $SVNREPO/$REPO -r HEAD 2>/dev/null | gzip > $TEMP/$REPO.svn.gzip

我在我执行的位置推送到/dev/null 文件,因为这是程序出错的地方。但是,该脚本似乎不再起作用。我在这里做错了什么?将 2>/dev/null 放在一行中间是否有问题?如果是这样,我该如何重构这段代码,使其不需要行中间的管道?

非常感谢您的帮助,我希望我的问题相当清楚!确认一下,最终的非工作代码如下:

#!/bin/bash

SVNREPO="/var/svn"
TEMP="/var/tmp"
BACKUP="/home/helix/backups"

cd $SVNREPO

if [ $# -eq 0 ]; then
for REPO in *; do
ARRAY+=($REPO)
done
else
for REPO in $@; do
ARRAY+=($REPO)
done
fi

trap 'echo ERROR! The repository or repositories that you are trying to backup do not exist!' ERR

for REPO in ${ARRAY[@]}; do
svnadmin dump $SVNREPO/$REPO -r HEAD 2>/dev/null | gzip > $TEMP/$REPO.svn.gzip sd
cp $TEMP/$REPO.svn.gzip $BACKUP/$REPO.svn.gzip
rm $TEMP/$REPO.svn.gzip
done

最佳答案

我不知道 trap 命令的具体工作原理,但我会建议另一种可能以另一种方式解决您的问题的方法:

首先,在您的for 循环之前,添加这一行:

set -o pipefail

这意味着当管道中的任何命令失败时,最后的退出代码 ($?) 将包含失败的错误代码。

在您的 svnadmin 调用之后的行中,我建议添加以下内容:

if [ $? -ne 0 ]; then
echo "ERROR! Received error code $? for repository '$REPO'."
continue
fi

您当然可以根据自己的喜好更改错误消息。功能应该很清楚:如果 svnadminbzip 失败,它将打印错误消息并继续 for 循环中的下一项。

希望这对您有所帮助。

关于linux - 我的第一个 bash 脚本中的错误处理问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42373184/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com