【问题标题】:Bash - error code in if statement not workingBash - if 语句中的错误代码不起作用
【发布时间】:2014-06-20 12:38:50
【问题描述】:

我正在编写一个 bash 脚本,它会备份到已安装的驱动器。

备份本身可以正常工作,但是即使在传输过程中出现错误,它也会说成功。

backup() {
echo -e "Backup Started\n" >> $1
echo -e "Mounting backup Drive" >> $1
mount $2 /mnt 2>>$1
if [ $? -eq 0 ] ; then
   echo -e "Backup Drive: $2 mounted successfully" >> $1
   cd /
   echo -e "Sync data to $2\n" >> $1
   nice -n 19 rsync -lHa --exclude-from '/opt/ts/bin/exclude.txt' / /mnt/ 2> ${ERROR}
   local RETURNCODE=$?
   if [ $RETURNCODE -eq 23 ] ; then backup_failed "Backup Warning: Some files did not copy" $1 $2; fi
   if [ $RETURNCODE -eq 20 ] ; then backup_failed "Backup Failed: Transfer was terminated prematurely" $1 $2; fi
   if [ $RETURNCODE -eq 11 ] ; then backup_failed "Backup Failed: Input/Output Error [URGENT]" $1 $2; fi
   if [ $RETURNCODE -ne 0 ] ; then backup_failed "Backup Failed: Error while copying data" $1 $2; fi
   echo -e "Backup completed Successfully with code $RETURNCODE `date`\n" >> $1
   echo -e >> $1
   printf "Time taken: "%dh:%dm:%ds"\n" $(($SECONDS/3600)) $(($SECONDS%3600/60)) $(($SECONDS%60)) >> $1
   echo -e "##############################\n" >> $1
   mkdir -p /mnt/mnt /mnt/proc /mnt/tmp /mnt/lost+found
   cp -a /proc/mounts /proc/filesystems /mnt/proc
   umount $2
fi
}

尽管 $RETURNCODE 给出的值为 20,但它不会触发。输出如下。

安装备份驱动器 备份驱动器:/dev/hda4 挂载成功 同步数据到 /dev/hda4

备份成功完成,代码 20 Sun May 4 11:04:48 EST 2014

耗时:0h:0m:3s

#

如果有人有任何建议,将不胜感激:)

【问题讨论】:

  • set -x 是你的朋友。跟踪脚本的执行,看看它实际在做什么。
  • 另外,我强烈建议通过shellcheck.net 运行它——它有很多小错误可能与您的问题无关,但仍应修复。

标签: linux bash if-statement error-code


【解决方案1】:

您确定函数 backup_failed 的行为符合预期吗?

另请注意,当 RETURNCODE 不为 0 且 backup_failed 不会终止脚本时,会触发两次 backup_failed:

if [ $RETURNCODE -eq 20 ] ; then backup_failed ...
...
if [ $RETURNCODE -ne 0 ] ; then backup_failed ...

希望这会有所帮助。

【讨论】:

  • 感谢 threadp :) 你是对的,backup_failed 的行为不符合预期。有一个 if 语句将未备份的文件与排除列表进行比较。这是来自旧版本的脚本,永远不会在当前版本中触发。
  • 其实比这还要糟糕,因为如果 RETURNCODE 是 20,它会调用backup_failed 两次(如前所述),并且还会打印“Backup completed successfully with code 20 ...”
  • backup_failed 在脚本完成后终止它,它按预期工作但是我确实计划改进代码(我最初没有制作脚本,我被要求添加一些错误处理和更改从 cpio 到 rsync) :)
  • 完成了,不记得以前在那里看到过勾号按钮,因为我正在寻找可以做到这一点的东西。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2015-07-30
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
相关资源
最近更新 更多