我对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;
答案 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 }
等等......