Сценарий оболочки, который я сделал, смехотворно многословен, а также, вероятно, неэффективен. Помогите!

Я новичок в Ubuntu, и до сих пор сделал несколько вещей, которыми я очень горжусь:

Сделал веб-сервер Apache со своим собственным html (до того, как неделю назад я его никогда не трогал). майнинг-сервер + узел titcoin

И мой последний проект - создание сценария оболочки для резервного копирования моего ВСЕГО (верно) жесткого диска на огромный внешний. Говоря о сути, я знаю, что могу кое-что улучшить (например, тот факт, что он рассказывает вам о содержании всего, что он торгует?), И я хотел бы узнать ваше мнение об этом:

Код:

#!/bin/bash
read -n1 -p “Would you like to back up your system? Uno for Si, and Dos for No.” 
echo
case $input in
1) fdisk -l;
echo;
read -p “Please enter the name of your backup disk that was displayed in the fdisk window: ” disk ;
echo;
echo “Backups now in progress! Please be aware that backups are saved to a Backups directory which this script creates, and backups are tarred and labelled by date!”;
echo “THIS WILL TAKE A VERY VERY LONG TIME IF YOU HAVE A LARGE FILESYSTEM! PLEASE BE PATIENT!!!”;
cd /;
sudo mkdir -p /mnt/$disk && sudo mount /dev/$disk /mnt/$disk && sudo mkdir -p /mnt/$disk/Backups && sudo tar -cp $(date +%Y%m%d).tar --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=backups . && sudo cp $(date +%Y%m%d-%H).tar /mnt/$disk/Backups;
echo “Okay, all done! To restore your system, you will have to untar and manually do it yourself. If you have any issues, email name@example.com!”;; 
2) echo “Then why are you running this script?”;;
*) echo “I'm sorry, but I can’t do that…”

esac

Честно говоря, я понятия не имею, что я делаю. Какие-либо предложения? Вот выдержка из вывода, который продолжался около 3 часов ... Ну, на самом деле, текст движется так быстро, что я даже не могу его скопировать / вставить ...

1
задан 8 May 2015 в 10:38

2 ответа

Глобальные проблемы:

  • Используйте добавление отступа. Это делает Ваш код более читаемым (для Вас и для нас).
  • Используйте только прямые кавычки в ударе. Другие типы кавычек могли бы повредить команды.
  • Не добавлять ; в конце единственной команды. ; символ имеет определенное значение, и это бесполезно, если добавлено к единственной команде.

Конкретные вопросы:

fdisk -l;

Необходимо работать fdisk как sudo: sudo fdisk -l

read -n1 -p “Would you like to back up your system? Uno for Si, and Dos for No.”

Вы не храните этот вход нигде. Видя код ниже, Вы отсутствуете input в конце (возражают против пространства после двойных кавычек): read -n1 -p "Would you like to back up your system? Uno for Si, and Dos for No." input

sudo mkdir -p /mnt/$disk && sudo mount /dev/$disk /mnt/$disk && sudo mkdir -p /mnt/$disk/Backups && sudo tar -cp $(date +%Y%m%d).tar --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=backups . && sudo cp $(date +%Y%m%d-%H).tar /mnt/$disk/Backups;

tar команда пропускает a -f опция: без него tar выводы к stdout а не в указанный файл; также имя файла должно быть $(date +%Y%m%d-%H) соответствовать имени файла, ожидаемому от cp: sudo mkdir -p /mnt/$disk && sudo mount /dev/$disk /mnt/$disk && sudo mkdir -p /mnt/$disk/Backups && sudo tar -cpf $(date +%Y%m%d-%H).tar --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=backups . && sudo cp $(date +%Y%m%d-%H).tar /mnt/$disk/Backups;

Заключительное примечание: делая так, Вы оставляете все резервные копии внутри /, но Вы также исключаете a /backups/ каталог от резервного копирования, таким образом, это походит на Вашу цель, должен сохранить копию каждого резервного копирования в такой папке. Удостоверьтесь, что такая папка существует. Исправленная версия последней команды согласно этому:

sudo mkdir -p /mnt/$disk && sudo mount /dev/$disk /mnt/$disk && sudo mkdir -p /mnt/$disk/Backups && sudo tar -cpf backups/$(date +%Y%m%d-%H).tar --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=backups . && sudo cp backups/$(date +%Y%m%d-%H).tar /mnt/$disk/Backups;

Так с отступом, прямо заключенный в кавычки, бесполезное -;- бесплатная, исправленная версия сценария:

#!/bin/bash

read -n1 -p "Would you like to back up your system? Uno for Si, and Dos for No." input
echo
case $input in
    1)
        sudo fdisk -l
        echo
        read -p "Please enter the name of your backup disk that was displayed in the fdisk window: " disk
        echo
        echo "Backups now in progress! Please be aware that backups are saved to a Backups directory which this script creates, and backups are tarred and labelled by date!"
        echo "THIS WILL TAKE A VERY VERY LONG TIME IF YOU HAVE A LARGE FILESYSTEM! PLEASE BE PATIENT!!!"
        cd /
        sudo mkdir -p /mnt/$disk && sudo mount /dev/$disk /mnt/$disk && sudo mkdir -p /mnt/$disk/Backups && sudo tar -cpf backups/$(date +%Y%m%d-%H).tar --directory=/ --exclude=proc --exclude=sys --exclude=dev/pts --exclude=backups . && sudo cp backups/$(date +%Y%m%d-%H).tar /mnt/$disk/Backups;
        echo "Okay, all done! To restore your system, you will have to untar and manually do it yourself. If you have any issues, email name@example.com!"
        ;;
    2)
        echo "Then why are you running this script?"
        ;;
    *)
        echo "I'm sorry, but I can’t do that…"
        ;;
esac

Последняя вещь: Никогда не оставляйте свой адрес электронной почты вокруг сети. Спаммеры очистят его. Я заменил его name@example.com в моем ответе, в Вашем ответе и в Вашем вопросе.

4
ответ дан 8 May 2015 в 10:38

Хорошо, понял.

#!/bin/bash
read -n1 -p "Would you like to back up verbosely and with minimal directories?? Uno for Si, and Dos for No." input
echo
case $input in
1) fdisk -l
echo
cd /
mkdir TempBackup && cd TempBackup
read -p "Please enter the name of your backup disk that was displayed in the fdisk window: " disk 
echo
echo "Tarring your /etc/ folder, be patient!" && sudo tar -cpf etc.tar /etc && echo "etc is tarred, copying now!" && sudo cp etc.tar /mnt/$disk/Backups && echo "Tarring your /bin/ folder!" && sudo tar -cpf bin.tar /bin && echo "bin is tarred, copying now!" && sudo cp bin.tar /mnt/$disk/Backups && echo "Tarring your /home/ folder, if you use bitcoind or litecoind it will be a bit!" && sudo tar -cpf home.tar --exclude=.cache --exclude=.gvfs /home && echo "home is tarred, copying now!" && sudo cp home.tar /mnt/$disk/Backups && sudo tar -cpf var.tar /var && echo "var is tarred, copying now!" && sudo cp etc.tar /mnt/$disk/Backups && cd / && echo "Tarring usr, IT IS UNLIKELY THAT THIS FILE CAN BE COPIED ON A FAT32 FS!!! AUTOSPLIT HAS BEEN ACTIVATED!!!" && sudo tar -cpf usr.tar /usr && echo "usr is tarred, copying/splitting now!" && mkdir split-files && cd split-files && split --bytes=1G /usr.tar split.tar && sudo cp * /mnt/$disk/Backups && cat split*.tar > usr.tar && cd /TempBackup && echo "Okay, finished! Let me clean up..."  && sleep 5 && echo "Cleaning all files...." && sudo rm -rf *.tar && echo "All Done!"
2) fdisk -l
echo
cd /
mkdir TempBackup && cd TempBackup
read -p "Please enter the name of your backup disk that was displayed in the fdisk window: " disk 
echo
echo "Backups now in progress! Please be aware that backups are saved to a Backups directory which this script creates, and backups are tarred and labelled by date!"
echo "THIS WILL TAKE A VERY VERY LONG TIME IF YOU HAVE A LARGE FILESYSTEM! PLEASE BE PATIENT!!!"
echo "THIS IS NOT THE SAME AS THE VERBOSE MODE! THIS COPIES ALL FILES TO DISK, NOT JUST THE COMMON ONES! YOU STILL HAVE TIME TO QUIT!!!"
sleep 10
cd /;
sudo mkdir -p /mnt/$disk && sudo mount /dev/$disk /mnt/$disk && sudo mkdir -p /mnt/$disk/Backups && sudo tar -cpf $(date +%Y%m%d).tar --directory=/ --exclude=proc --exclude=sys --exclude=dev pts --exclude=backups . && sudo cp $(date +%Y%m%d-%H).tar /mnt/$disk/Backups
echo "Okay, all done! To restore your system, you will have to untar and manually do it yourself. If you have any issues, email name@example.com!"
*) echo "I'm sorry, but I can't do that..."
esac

Не стесняйтесь использовать это!

0
ответ дан 8 May 2015 в 10:38

Другие вопросы по тегам:

Похожие вопросы: