Помогите с простым скриптом

Я сделал простой скрипт резервного копирования

Код:

function backups_remove_file
{
    echo ""
    echo "2. Make Backups Of Files(s)"
    echo ""
    echo "Which File You Wanna To Make Backups?"
    read back
    echo "What's The File's Name Should Be After Backups? And Where?"
    read after
    read -p "Continue (y/n)?" CONT1
    if [ "$CONT1" == "y" ]; then
        tar -cvpzf "$after.tar.gz" "$back"
        echo "Backups File Successful !" ;
    else
        echo "Backups File Unsuccessful !" ;
    fi
}

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

Which File You Want To Make Backups?

, если после этого вы, например, напишите «test», следующий вопрос

What's The File's Name Should Be After Backups? And Where?

, если вы напишите, например, «test1», тогда возникнет проблема безопасности, если они захотят продолжить или нет, если напечатать y, это будет напрямую:

taking: test: can not state: No such file or directory
tar: Exiting with failure status due to previous errors
 Backups File Successful!

Его должно быть Backups File Unsuccessful!. Что я должен сделать, чтобы сделать правильно и будет "Файл резервных копий не удалось!" ??

1
задан 10 January 2014 в 22:49

3 ответа

Я думаю, что лучший сценарий будет читать ввод командной строки - что-то вроде:

#/bin/bash
echo "Shall back up $1 as $2 - press Ctrl-C to exit if this is not what you want" 
sleep 3
echo "Backing Up..."
tar -cvpzf $2.tar.gz $1
echo "Backing up of $1 Complete"
notify-send -t 8000 "Backing up of $1 complete"
exit

Затем вы можете ввести команду следующим образом:

COMMAND "/path/to/input" "/path/to/output"

notify-send также отправьте графическое уведомление, чтобы оно сообщило вам, когда это будет сделано.

Это только мое предложение - через секунду я посмотрю на ваше ...


Проблема с вашим скриптом заключается в следующем. Он скажет успешный, как $CONT1 = y, поэтому он выполнит команду резервного копирования tar..., а затем эхо Success. Эхо будет только неудачным, если вы введете параметр continue не как y. Таким образом, для этого конкретного сценария лучшим его концом будет (это только изменит то, что echo указано в выводе терминала) :

if [ "$CONT1" == "y" ]; then
        tar -cvpzf "$after.tar.gz" "$back"
        echo "Backing up File finished!" ;
else
        echo "Did not backup" ;
fi
exit

Это кажется work:

#!/bin/bash
echo ""
echo "Which File you want to backup?";
read input
echo "Where do you you want it to be backed up? (include .tar.gz extension)";
read output
read -p "Continue (y/n)? " CONT
if [ "$CONT" == "y" ]; then
        tar -cpf "$input" "$output" || 'echo "Backing Up Failed" && exit;'
    echo "Backing Up Successful!"
else
        echo "Did not backup" ;
fi
exit

|| после команды означает, что она выполнит 'echo "Backing Up Failed" && exit;' только в том случае, если команда выдаст ошибки, что заставит ее повторить неудачу и затем завершиться. Если команда не выдаст ошибок, она проигнорирует это, отобразит сообщение Successful и завершится.

Это может иметь проблемы с путями к некоторым файлам, поэтому вы можете использовать другой сценарий, который я предложил ...

Надеюсь, это поможет.

0
ответ дан 10 January 2014 в 22:49

Я добавляю еще одно условие if в ваш скрипт. Это будет работать, как вы хотите. Смотрите модифицированный скрипт ниже.

#!/bin/bash

function backups_remove_file()
{
    echo "Make Backups Of Files(s)"
    echo "Which File You Wanna To Make Backups?"
    read back
    echo "What's The File's Name Should Be After Backups? And Where?"
    read after
    read -p "Continue (y/n)?" CONT1
    if [ "$CONT1" == "y" ]; then
        tar -cvpzf "$after.tar.gz" "$back"
        if [ $? == 0 ]; then
            echo "Backups File Successful !"
        else
            echo "Backups File Unsuccessful !"
            exit 1
        fi
    else
        echo "Backups File Unsuccessful !" 
    fi
}

backups_remove_file

$? хранит состояние выхода последней команды в оболочке. в случае успеха это будет 0

0
ответ дан 10 January 2014 в 22:49

Это работает:

function backups_remove_file
{
    echo ""
    echo "2. Make Backups Of Files(s)"
    echo ""
    echo "Which File You Wanna To Make Backups?"
    read back
    echo "What's The File's Name Should Be After Backups? And Where?"
    read after
    read -p "Continue (y/n)?" CONT1
    if [ "$CONT1" == "y" ]; then
        if tar -cvpzf "$after.tar.gz" "$back"; then
            echo "Backups File Successful !"
        else
            echo "Backups File Unuccessful !"
        fi
    else
        echo "User selected no"
    fi
}

Причина в том, что строка после tar ... выполняется независимо от кода выхода. Это означает, что он всегда будет отражать «успешно». Bash не вызывает автоматически исключение / ошибку, если что-то пошло не так.

Это исправлено с помощью tar ... в операторе if, поэтому его код выхода влияет на то, какой путь он принимает из оператора if.

0
ответ дан 10 January 2014 в 22:49

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

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