Bash:备份脚本在shell出口上运行

时间:2011-11-14 03:49:11

标签: bash backup

我在bash中开发了一个菜单,其中包含一些选项(此处仅包括备份),其中一个选项是备份,但每当我关闭shell时,backup命令都会自行运行并进行备份。

我尝试添加break并退出之前;;但它只是停止了整个剧本。

#!/bin/bash

menu=$(echo "Choose operation [1]Hi [2]Backup")

echo "$menu"

while [ $# == 0 ]; do
  read options

  case "$options" in
    1 )  
    echo "HI"  
    echo "$menu"
  ;;

  2 )
    dir="/home/backups"
    bckup="$(date +%d%b%Y_%H%M)"
    mkdir $dir/$bckup
    cat /etc/passwd >> $dir/$bckup/"DB$bckup".txt

    dialog --title "DATABASE" --msgbox " Ready to backup user database. \n
    press <Enter> to start or <Esc> to cancel." 10 50

    # Return status of non-zero indicates cancel
    if [ "$?" != "0" ]
    then
        dialog --title "BACKUP" --msgbox " Backup was canceled at your request." 10 50
    else
        dialog --title "BACKUP" --infobox " Backup in process..." 10 50 ; sleep 1

        tar czf $dir/$bckup.tgz -C $dir/$bckup . >|/tmp/ERRORS$$ 2>&1

      # zero status indicates backup was successful
      if [ "$?" = "0" ]
      then
        dialog --title "BACKUP" --msgbox " Backup completed successfully." 10 50
      else
        dialog --title "BACKUP" --msgbox "Backup failed Press <Enter> to see error log." 10 50
       dialog --title "Error Log" --textbox /tmp/ERRORS$$ 22 72
      fi
    fi
    rm -r -f $dir/$bckup
    rm -f /tmp/ERRORS$$
    clear
    echo "$menu"
  ;;

  *)
    echo "Invalid, Please choose a valid option"
  ;;
esac
done
exit

1 个答案:

答案 0 :(得分:0)

当您输入EOF时会发生什么:

read options

你不测试是否有效。 options可能包含先前的值,而您之前尝试过备份。如果诊断正确,则修复非常简单:

if read options
then
    ...the script you currently have interpreting $options
else break  # The while loop ... which has an interesting (read 'unusual') condition.
fi

你也可以(应该?)提供一个明确的退出选项,但这样可以在你输入 Control-D 或者你用作终端的EOF指示之后保护你免受意外备份

稍微更激进的重组使用:

if [ $# -eq 0 ]
then
    while read options
    do
        ...the script you currently have interpreting $options
    done
fi

或:

if [ $# -ne 0 ]
then exit 1
fi

while read options
do
    ...the script you currently have interpreting $options
done

  

请告诉我while [ $# == 0 ];[ $# -ne 0 ]-eq之间的区别。

这是shell语义的问题。

  • while [ $# == 0 ]$# 0的参数数进行字符串相等比较。
  • while [ $# != 0 ]对参数数量和0进行字符串不等式比较。
  • while [ $# -ne 0 ]对参数数量和0进行数值不等式比较。
  • while [ $# -eq 0 ]对参数个数和0进行数字相等比较。

请注意,这与Perl约定相反,其中:

  • $x == 0是数字相等
  • $x != 0是数字不等式
  • $x eq 0是字符串相等
  • $x ne 0是字符串不等式

在所有情况对中,当比较为(in)相等且结果以常规方式表示时(使用最小位数并表示为整数),结果相同。排序比较的数字与字符串比较很重要(><>=<=)。

您的原始代码在while [ $# == 0 ]上循环(虽然没有位置参数)。如果有任何参数(所以$# != 0$# > 0,因为参数的数量永远不会为负),所以永远不会输入循环。

我的第一个重写在进入while read options循环之前检查没有参数。

如果有任何参数,我的第二个重写会提前退出,因此当参数存在时,根本不会进入while read options循环。它们是等价的,只是第一次重写使循环体更深一层嵌套。

请注意,所显示的代码都不会更改位置参数的数量(参数数量)。如果你真的想要,你可以用set -- arg1 arg2 ...来做,但你可能不这样做。