如何在shell脚本中处理错误

3

我正在编写一个shell脚本来安装我的应用程序。我的脚本中有许多命令,例如复制、解压缩、移动、if语句等等。如果任何一个命令失败了,我想知道错误信息。同时,我不想发送除0以外的退出代码。

脚本安装顺序(root-file.sh):

./script-to-install-mongodb
./script-to-install-jdk8
./script-to-install-myapplicaiton

示例脚本文件:

cp sourceDir destinationDir

unzip filename

if [ true] 
// success code
if

我希望能够通过变量或任何信息,知道在root-file.sh脚本中是否有任何脚本命令失败。

我不想编写代码来检查每个命令的状态。有时候cp或mv命令可能会因为无效目录而失败。在脚本执行结束时,我想知道所有命令是否都成功执行或者其中是否有错误。

有没有一种方法可以做到这一点?

注意:我使用的是shell脚本而不是bash。


"$?" 给出了上一个执行的命令的状态,我认为你可以使用它... 例如 - test -x <某个文件> 如果 [ $? -ne 0 ] 那么就输出 "文件不存在" 并退出 0。 - deepakl
@karan - 如果我的解决方案解决了你的问题,请接受答案并点赞! - JRG
4个回答

3

/* 上一条命令的状态存储在特殊变量$?中,您可以通过导出变量来定义$?的变量 var=$? */

unzip filename
export unzipStatus=$?
./script1.sh
export script1Status=$?
if [ !["$unzipStatus" || "$script1Status"]]
     then                  
         echo "Everything successful!"       
     else
         echo "unsuccessful"
fi

@karan,我更新了我的答案。逻辑是如果任何一个状态不成功,最终操作就不成功。 - Uddhav P. Gautam
@karan,逻辑很简单,你必须对所有逻辑OR取反。 - Uddhav P. Gautam

2

既然你正在使用shell脚本来实现这个目标,那么就没有太多外部工具可用。所以默认的$?应该会有所帮助。你可能需要在脚本之间检查检索值。代码将如下所示:

./script_1
retval=$?
if $retval==0; then
  echo "script_1 successfully executed ..."
  continue
else; 
  echo "script_1 failed with error exit code !"
  break
fi
./script_2

告诉我这是否对您的情况有所帮助。

1

我想在这里提供一些建议。请按照以下方式运行您的Shell:

sh root-file.sh 2> errors.txt

从errors.txt中筛选grep模式

grep -e "root-file.sh: line" -e "script-to-install-mongodb.sh: line" -e "script-to-install-jdk8.sh: line" -e "script-to-install-myapplicaiton.sh: line" errors.txt

以上grep命令的输出将显示出现错误的命令以及行号。比如输出是:

test.sh: 第8行:file3:权限被拒绝

您可以直接查看出现问题的行号(这里是8),请参考此在vi中跳转到指定行

或者也可以自动化处理:从shell脚本中grep特定行,在这里是grep出有问题的第8行。

head -8 test1.sh |tail -1

希望能帮到您。


1
在Linux Shell脚本中,可以按照以下方式处理异常。
command || fallback_command

如果您有多个命令,那么可以这样做:
(command_one && command_two) || fallback_command

在这里,fallback_command可以是一个在文件中记录细节的echolog等命令。
我不知道你是否尝试在脚本顶部添加set -x以查看详细的执行过程。

我的解决方案不需要您检查每个命令的状态,但将使您能够拥有备用命令,因此您可以在屏幕上回显失败或成功,也可以将详细信息记录在日志文件中以供以后查看。 - JRG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接