我对bash脚本非常陌生,对于我的第一个脚本尝试,我将文件提交给同一服务器中的教授dropbox。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
错误(如文件不存在),并且能够输出我自己的错误消息。
所以基本上是这样的:
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
错误输出到壳!最常见的错误可能是“不能stat blah:没有这样的文件或目录”。我想抓住那个错误,并简单地说“提交失败”。
编辑#2: jcollado的回答是正确的,问题是在我的部分。没有用适当的“fi
”结束嵌套if-else
。
修复后,它按预期工作。仍然需要捕捉错误输出,但我相信我知道我需要自己去解决这个问题,因此就我而言,这个问题得到了解答。
FINAL EDIT:啊,什么 - 重定向是如此简单我想我会把解决方案放在这里。如果使用Linux,只需添加“2>/dev/null
”(如果你不想错误信息被保存在任何文件做)的cp
后,使“cp -r /first/path /second/path 2>/dev/null
”
感谢您的替代解决方案。基于简单的最佳答案。 – skippr
我相信上面的退出代码将始终为零。如果'cp'失败(返回非0),则'if'将返回0. bash的'echo'总是返回0.从手册页中,关于'if':*退出状态是最后执行的命令的退出状态如果没有条件测试真的,则为零。* –
@ mr.spuratic:看起来你是对的。运行'如果为true;然后回显真实;网络连接; echo $?'在Bash,Korn shell中,Heirloom shell输出true然后是0;用“if false”代替它。然后回显真实;网络连接; echo $?',它只打印0.因此,'$?'状态不会保留'if'中执行的命令的退出状态。周围有许多方式,或多或少优雅。其中一个就是'status = 0;如果属实;然后回显真实;其他状态= 1;网络连接; echo $ status'。或者你可以做相反的事:'status = 1;如果属实;然后回显真实;状态= 0;网络连接; echo $ status'。 –