1 votes

Réparation de la condition dans un script de sauvegarde interactif

J'ai créé un script de sauvegarde simple

Code:

function backups_remove_file
{
    echo ""
    echo "2. Faire des sauvegardes de fichier(s)"
    echo ""
    echo "Quel fichier voulez-vous sauvegarder?"
    read back
    echo "Comment devrait s'appeler le fichier après la sauvegarde? Et où?"
    read after
    read -p "Continuer (o/n)?" CONT1
    if [ "$CONT1" == "o" ]; then
        tar -cvpzf "$after.tar.gz" "$back"
        echo "Fichier de sauvegarde réussi !" ;
    else
        echo "Échec de la sauvegarde du fichier !" ;
    fi
}

Mais il y a un petit problème que je n'ai pas pu résoudre. Lorsqu'il affiche

Quel fichier voulez-vous sauvegarder?

si vous écrivez par exemple "test" après cela, et pour la question suivante

Quel devrait être le nom du fichier après la sauvegarde? Et où?

si vous écrivez par exemple "test1", alors il y aura un problème de sécurité s'ils veulent continuer ou non, si vous tapez o il affichera:

prendre : test : ne peut pas spécifier : Aucun fichier ou dossier de ce type
tar : Sortie avec un statut d'échec en raison d'erreurs précédentes
 Fichier de sauvegarde réussi!

Le résultat dans ce cas devrait être Échec de la sauvegarde du fichier!. Que devrais-je faire pour obtenir le résultat attendu dans ce cas?

2voto

Wilf Points 28034

Je pense qu'un script meilleur serait de lire l'entrée de la ligne de commande - quelque chose comme :

#/bin/bash
echo "Sauvegarder $1 sous le nom $2 - appuyez sur Ctrl-C pour annuler si ce n'est pas ce que vous voulez" 
sleep 3
echo "Sauvegarde en cours..."
tar -cvpzf $2.tar.gz $1
echo "Sauvegarde de $1 terminée"
notify-send -t 8000 "Sauvegarde de $1 terminée"
exit

Vous pourriez alors entrer la commande de cette manière :

COMMAND "/chemin/vers/l'entrée" "/chemin/vers/la/sortie"

Le notify-send enverra également une notification graphique, donc il vous avertira quand il aura terminé.

Ceci n'est que ma suggestion - je vais jeter un coup d'œil à la vôtre dans un instant...


Le problème avec votre script est le suivant. Il dira que c'est réussi, car $CONT1 = y, donc il exécutera la commande de sauvegarde tar..., puis affichera Succès. Il n'affichera "non réussi" que si vous entrez le paramètre de continuer non pas en tant que y. Donc pour ce script particulier, il serait préférable de le terminer de cette manière (cela ne change que ce qui est echo dans la sortie du terminal) :

if [ "$CONT1" == "y" ]; then
        tar -cvpzf "$after.tar.gz" "$back"
        echo "Sauvegarde du fichier terminée!" ;
else
        echo "N'a pas sauvegardé" ;
fi
exit

Cela semble fonctionner :

#!/bin/bash
echo ""
echo "Quel fichier voulez-vous sauvegarder ?";
read input
echo "Où voulez-vous effectuer la sauvegarde ? (inclure l'extension .tar.gz)";
read output
read -p "Continuer (o/n) ? " CONT
if [ "$CONT" == "y" ]; then
        tar -cpf "$input" "$output" || 'echo "Échec de la sauvegarde" && exit;'
    echo "Sauvegarde réussie !"
else
        echo "N'a pas sauvegardé" ;
fi
exit

Le || après la commande signifie qu'elle n'exécutera 'echo "Échec de la sauvegarde" && exit;' que si la commande produit des erreurs, ce qui fera qu'elle affichera qu'elle a échoué puis quittera. Si la commande ne produit pas d'erreurs, elle ignorera cela, affichera Réussi, et sortira.

Cela peut poser des problèmes avec les chemins de certains fichiers, donc vous voudrez peut-être utiliser l'autre script que j'ai suggéré...

J'espère que cela vous aidera.

2voto

sourav c. Points 40637

Je suis en train d'ajouter une autre condition if dans votre script. Cela fonctionnera comme vous le souhaitez. Veuillez consulter le script modifié ci-dessous.

#!/bin/bash

function backups\_remove\_file()
{
    echo "Faire des sauvegardes de fichier(s)"
    echo "Quel fichier voulez-vous sauvegarder?"
    read back
    echo "Quel devrait être le nom du fichier après la sauvegarde? Et où?"
    read after
    read -p "Continuer (o/n)?" CONT1
    if \[ "$CONT1" == "o" \]; then
        tar -cvpzf "$after.tar.gz" "$back"
        if \[ $? == 0 \]; then
            echo "Fichier de sauvegarde réussi !"
        else
            echo "Échec de la sauvegarde du fichier !"
            exit 1
        fi
    else
        echo "Échec de la sauvegarde du fichier !" 
    fi
}

backups\_remove\_file

$? stocke le statut de sortie de la dernière commande dans le shell. En cas de succès, il sera 0

1voto

kiri Points 25860

Cela fonctionne:

function backups_remove_file
{
    echo ""
    echo "2. Backups des fichiers(s)"
    echo ""
    echo "Quel fichier voulez-vous sauvegarder?"
    read back
    echo "Comment doit s'appeler le fichier après la sauvegarde? Et où?"
    read after
    read -p "Continuer (o/n)?" CONT1
    if [ "$CONT1" == "o" ]; then
        if tar -cvpzf "$after.tar.gz" "$back"; then
            echo "Fichier de sauvegarde réussi!"
        else
            echo "Échec de la sauvegarde du fichier!"
        fi
    else
        echo "L'utilisateur a sélectionné non"
    fi
}

La raison en est que la ligne après tar ... est exécutée indépendamment du code de sortie. Cela signifie qu'elle affichera toujours 'réussi'. Bash ne soulève pas automatiquement d'exception/erreur si quelque chose s'est mal passé.

Cela est corrigé en utilisant le tar ... dans une déclaration if de sorte que son code de sortie influe sur le chemin à prendre à partir de la déclaration if.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X