Bash脚本错误捕获

时间:2012-01-16 20:47:28

标签: bash error-handling

我对bash脚本非常陌生,对于我的第一次脚本尝试,我将文件提交到同一服务器中我教授的保管箱。

代码是这样的:

#! /bin/bash
echo "Submit Lab$1? \c"

read choice

if [ $choice = "y" ]; then
   echo "Sending to Prof's dropbox..."
   cp -r /path/to/lab$1 /path/to/dropbox
else
   echo "Submission terminated."
fi

该命令的用法仅仅是" $ submit 1" (1是一个整数,对应于我想提交的实验室)

bash脚本将输入的参数(单个整数)附加到必要的文件名(目录),然后使用cp将该目录提交到我的教程的保管箱。

为了学习而不是绝对必要,我想创建一个干净的提示,它将捕获任何cp错误(例如文件不存在),并能够输出我自己的错误消息。< / p>

基本上,就像:

echo "Submit lab$1?"

read choice

echo "Send to Prof's dropbox"
cp -rv /path/to/lab$1 /path/to/dropbox

<catch any errors from cp>

if [ cp has errors ]

   echo "Submission failed."

else if [ cp has no errors ]

   echo "Submission successful."

And so on...

我知道我可以使用详细模式,而cp本身会打印出错误,但如前所述,我这样做的目的是为了学习错误捕获bash并且能够制作错误一个干净的提示。

任何帮助都将不胜感激。

谢谢!


另外:我有一个类似的脚本,使用scp从我的笔记本电脑提交实验。假设我已经回答了这个问题,我可以用完全相同的方式将解决方案应用于scp吗?

编辑:我不希望cp错误输出到shell!最常见的错误可能是&#34;不能统计错误:没有这样的文件或目录。&#34;我想抓住这个错误,简单地说&#34;提交失败。&#34;

编辑#2: jcollado的回答是正确的,问题在于我。未使用正确的&#34; if-else结束嵌套fi。&#34;

修好后,它按预期工作。仍然需要捕获错误输出,但我相信我知道我需要在哪里自己解决这个问题,所以就我所关注的问题回答这个问题。

最终编辑:啊,到底是什么 - 重定向非常简单我想我会把解决方案放在这里。如果使用Linux,只需添加&#34; 2>/dev/null&#34; (如果您不想在任何文件中保存错误消息),请cp制作&#34; cp -r /first/path /second/path 2>/dev/null&#34;

3 个答案:

答案 0 :(得分:24)

虽然您可以测试$ ?,但您也可以直接测试命令的退出状态:

if cp -rv /path/to/lab$1 /path/to/dropbox
then echo Submission successful
fi
exit $?

错误已由cp报告给标准错误。如果exit成功,则显示的cp将以状态0(成功)退出;否则,它将以cp退出的状态退出。

显然,如果你愿意,你可以将它包装在一个循环中,或者你可以使它非交互式(但任何退出都会终止脚本)。

答案 1 :(得分:10)

要检查上一个命令的返回码,可以使用$?特殊变量,如下所示:

if [ "$?" -ne "0" ]; then
  echo "Submission failed"
  exit 1
fi

echo "Submission successful."

此外,如果您想要一个干净的提示,您可以按照here的说明重新stderr

最后,您也可以在使用scp的脚本中使用它,因为无论您使用哪种命令,它都能正常工作。

答案 2 :(得分:2)

echo "Submit lab$1?"

read choice

echo "Send to Prof's dropbox"
cp -rv /path/to/lab$1 /path/to/dropbox &>/dev/null

[ $? -eq 0 ] && { #success, do something } || { #fail, do something }

等等......