Bash: сценарий резервного копирования выполняется при выходе из оболочки

#bash #backup

#bash #резервное копирование

Вопрос:

Я разработал меню в bash с некоторыми опциями (здесь будет включено только резервное копирование), одной из этих опций является резервное копирование, однако всякий раз, когда я закрываю оболочку, запускается команда резервного копирования и создает резервную копию самостоятельно.

Я пытался добавить break и exit раньше ;; но это просто останавливает весь скрипт.

 #!/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>amp;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. В вашем меню должен быть запущен скрипт, который выполняет это резервное копирование, чтобы вы могли протестировать резервное копирование изолированно. Это также облегчило бы понимание кода; показанный неправильный отступ ни в малейшей степени не улучшает его разборчивость. (Табуляции не рекомендуются в коде, представленном на SO.)

2. используйте функцию отладки оболочки, т.е. set -vx в верхней части сценария. Он распечатает каждую строку / блок по мере их вычисления сценарием И покажет значения переменных. Вы должны быть в состоянии понять, почему выполняется резервное копирование. (Здесь это не очевидно). Удачи.

3. Привет, я заставлю скрипт запускать эту резервную копию изолированно, если нет другого варианта, спасибо.

4. В качестве комментария к стилю, menu=$(echo "text") более элегантно выражается как menu="text" . Эхо в обратных ссылках является обычным антишаблоном для новичков.

5. Пожалуйста, не удаляйте скрипт. Людям, которые придут позже, будет трудно понять, о чем говорится в комментариях и ответах.

Ответ №1:

Что происходит, когда вы вводите 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 .

Это вопрос семантики оболочки.

  • 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 является ли строковое неравенство

Во всех парах случаев результат одинаков, когда сравнения равны и значения выражены обычным способом (с использованием минимального количества цифр и в виде целого числа). Сравнение чисел со строками имеет значение для упорядочивания сравнений ( > , < , >= , <= , ,,).

Ваш исходный код повторяется while [ $# == 0 ] (пока нет позиционных аргументов). Если есть какие-либо аргументы (so $# != 0 или $# > 0 , поскольку количество аргументов никогда не бывает отрицательным), цикл никогда не вводится.

Первая из моих перезаписей проверяет отсутствие аргументов перед входом в while read options цикл.

Вторая из моих перезаписей завершается досрочно, если есть какие-либо аргументы, и поэтому вообще не входит в while read options цикл при наличии аргументов. Они эквивалентны, за исключением того, что при первой перезаписи тело цикла вложено на один уровень глубже.

Обратите внимание, что ни один из показанных кодов никогда не изменяет количество позиционных параметров (количество аргументов). Вы бы сделали это с помощью set -- arg1 arg2 ... , если бы действительно хотели, но, вероятно, вы этого не делаете.

Комментарии:

1. Это имеет смысл, но я немного запутался, я только начал писать сценарии 3 дня назад, должен ли я использовать теги EOF, HERE или STOP

2. Да, я сделал резервную копию, чтобы проверить, работает ли она, потому что я просто изменил часть кода, затем я выхожу из оболочки, а затем нахожу новую резервную копию в папке, означающую, что команда выполняется самостоятельно

3. Как бы мне добавить EOF для чтения? что-то вроде параметров чтения <<EOF я не знаю, для чего нужен eof

4. Как я показываю в отредактированной версии ответа, проверка состояния read . Обозначение ‘<<EOF’ предназначено для ‘here document’, где текст входного документа содержится в строках, следующих за перенаправлением, вплоть до строки, содержащей просто ‘EOF’ в виде слова.

5. Я выбрал второй вариант, и он устранил проблему. Мне нужно понимать каждую строку кода, пожалуйста, скажите мне, в чем разница между while [ $ # == 0]; и [$ # -ne 0] и -eq