以编程方式检查shell脚本中的失败scp的最佳方法

时间:2011-03-11 00:21:35

标签: bash shell unix

我有一个shell脚本,我正在使用这行代码执行循环遍历本地文件(.gz)并执行scp。如果可能,我想测试失败的scp。我正在做一个循环,所以我可以将每个文件名回显给日志,以便我可以跟踪它。

有人可以告诉我如何检查失败的scp吗?或者更好的是,这是一个很好的代码示例吗?谢谢你的帮助。

for gzfile in $LOCALDMPDIR/*.gz
do
  /usr/bin/scp -P 2222 -i $KEYFILE $gzfile foobar@$1:$TGTDIR
  echo "$gzfile is done. " 2>&1
done

5 个答案:

答案 0 :(得分:22)

使用$?访问最后一个命令的返回值。检查scp的手册页以进行验证,但我认为返回值为零意味着成功。非零值意味着某种失败。

答案 1 :(得分:9)

使用:

if [ $? -eq 0 ];
then
    echo "OK"</br>
else
    echo "NOK"</br>
fi
  

“[”之后和“]之前有空白。   不要围绕$?和0带引号

答案 2 :(得分:4)

您可以检查变量$?以查看scp的返回代码。如果它返回非零,则发生错误。

答案 3 :(得分:1)

您还可以尝试将错误捕获到日志中:

for gzfile in $LOCALDMPDIR/*.gz
do
  /usr/bin/scp -P 2222 -i $KEYFILE $gzfile foobar@$1:$TGTDIR 2>>/var/log/scperror.log \
  && echo "$gzfile is done." \
  || echo "scp error: $gzfile"
done

答案 4 :(得分:0)

对于那些像我一样的人,他们花费的时间比平常更长时间搞乱格式化错误:

scp "fromHere" hostname:"toThere"
if [ "$?" -eq "0" ];
then
    echo "SUCCESS"
else
    echo "FAIL"
fi