Вопрос Помощь с простым скриптом


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

Код:

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
2018-01-10 17:06


происхождения


хорошо я попробовал вашу функцию в сценарии и примере, и это сработало. - precise
"..Данный файл или каталог отсутствует..." да для таких случаев с несуществующими целями вам нужен правильный улов в вашем скрипте. - precise
Вместо этого вы должны просто написать псевдоним tar в форме bktar='tar -cvpzf "$after.tar.gz" "$back"' или что-то вроде этого вместо бессмысленного создания функции. - Braiam


ответы:


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

#/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

Это похоже на работу:

#!/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;' если команда вызывает ошибки, что приведет к тому, что он будет эхом, что он потерпел неудачу, а затем выйдет. Если команда не вызывает ошибок, она игнорирует это, echo Successful и exit.

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

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


2
2018-01-10 17:26





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

#! / Bin / Баш

функция backups_remove_file ()
{
    echo "Сделать резервные копии файлов (ов)"
    echo "Какой файл вы хотите сделать резервными копиями?"
    читать назад
    echo «Что такое имя файла должно быть после резервного копирования? И где?»
    читать после
    read -p "Продолжить (y / n)?" CONT1
    если ["$ CONT1" == "y"]; тогда
        tar -cvpzf "$ after.tar.gz" "$ back"
        если [$? == 0]; тогда
            echo «Файл резервных копий успешно!»
        еще
            echo "Файл резервных копий не увенчался успехом!"
            выход 1
        фи
    еще
        echo "Файл резервных копий не увенчался успехом!"
    фи
}

backups_remove_file

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


2
2018-01-10 18:09





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

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 заявление.


1
2018-01-10 20:56