Votre avis sur un script bash

Bonjour à tous,

Je me permets de vous demander votre avis sur un script que j’ai fait surtout à titre d’exercice, car j’ai un doute sur sa “propreté”.

Je pense que mon indentation est parfois hasardeuse (heureusement que ce n’est pas du python!).

Le bidule (je l’ai mis sous GPL v3 par fierté, je ne pense pas que qui que ce soit en veuille en l’état!) :

[code]#!/bin/bash
set +v
clear

Déclarons les variables utiles dans le script

user=$(whoami)
machine=$(hostname)
DATE=$(date +%y%m%d)
PATH_SAV=/media/HERCULE/save

echo "#########################################################################################"
echo "##### Bienvenue $user dans le Über-script de sauvegarde et maintenance sur $machine #####"
echo "##### Proposé par Arthur sous licence GPLv3 #####"
echo -e “#########################################################################################\n\n\n\n”

Déclarons les fonctions:

Cette fonction permet de tester la présence du support de sauvegarde:

function test_support {
ls /media/HERCULE/save
if [ $? != “0” ]
then
echo "Le support de sauvegarde n’est pas monté!"
echo -e "Retour au menu\n"
menu_first
fi
}

function sauvegarde_systeme {
echo -e "\nVous avez demandé la sauvegarde système, ne quittez pas!\n"
test_support
su -c "rsync -avz --progress --delete --exclude-from=/home/arthur/Tech/exclude / $PATH_SAV/$machine"
exit
}

function sauvegarde_forum {
echo -e "\nVous avez demandé la sauvegarde du forum, ne quittez pas!\n"
test_support
mkdir $PATH_SAV/forum/$DATE/
echo "Connexion au serveur ftp et copie des fichiers…"
wget -r -c ftp://utilisateur:motdepasse@url.fr/* -P $PATH_SAV/forum/$DATE/
if [ “$?” != “0” ]
then
echo "Des avertissements sont survenus lors du transfert!"
exit 1
fi
echo "Compression des fichiers"
tar -cvjf $DATE.tar.bz $PATH_SAV/trux/$DATE/forum/*
if [ “$?” != “0” ]
then
echo "Des avertissements sont survenus lors de la compression!"
exit 2
fi
rm -rf /$PATH_SAV/forum/$DATE
mv $DATE.tar.bz $PATH_SAV/forum/
echo "La sauvegarde est terminée. Aucun incident à déplorer…"
exit
}

function update {
echo -e "\nVous avez demandé la mise à jour système, ne quittez pas!\n"
su -c "update-pciids && update-usbids && apt-get update && apt-get dist-upgrade && apt-get clean && apt-get autoclean"
exit
}

function session_kill {
echo -e "\nVous avez demandé à déconnecter un utilisateur, ne quittez pas!\n"
echo -e "\nVoici la liste des utilisateurs connectés:\n"
who
echo -e "\nQuel utilisateur voulez-vous déconnecter? Toutes ses applications seront fermées, et le risque de perte de données est non nul!"
read user2kill
su -c "killall -9 -u $user2kill -r"
if [ “$?” != “0” ]
then echo -e "\nL’utilisateur n’a pas pu être déconnecté!\n"
fi
exit

}

function menu_first {
echo -e "\n\n\n\n???"
echo -e "==============> Que voulez-vous faire? <==============\n"
echo -e "1- Mise à jour 2- Sauvegarde système 3-Sauvegarde forum \n4- Nettoyage 5- Tuer une session \n9- Quitter\n"
echo 'Saisissez votre choix puis “ENTRÉE”:'
read choix
if [ “$choix” = “9” ]
then
exit
elif [ “$choix” = “2” ]
then
sauvegarde_systeme
elif [ “$choix” = “3” ]
then
sauvegarde_forum
elif [ “$choix” = “1” ]
then
update
elif [ “$choix” = “4” ]
then
echo "Le nettoyage n’a pas encore été implémenté!"
menu_first
elif [ “$choix” = “5” ]
then
session_kill
else echo "Choix erroné"
fi
}

Tout est prêt, appelons le menu principal!

menu_first[/code]

NB: Pas de sqldump pour la sauvegarde du forum, car le forum est sur le mutualisé d’un ami et je n’ai pas encore accès à la base, donc je fais une sauvegarde locale de la base avec phpBB puis je récupère tout.

C’est avec plaisir que je vais relire ça :slightly_smiling:

Alors le test pourrais être simplifié en plus tu as déjà mis le chemin dans une variable autant l’utiliser :

function test_support { ls /media/HERCULE/save if [ $? != "0" ] then echo "Le support de sauvegarde n'est pas monté!" echo -e "Retour au menu\n" menu_first fi }
comme ça

function test_support { if [ -d "$PATH_SAV" ] then echo "Le support de sauvegarde n'est pas monté!" echo -e "Retour au menu\n" menu_first fi }

Pour la fonction sauvegarde_forum :

function sauvegarde_forum { echo -e "\nVous avez demandé la sauvegarde du forum, ne quittez pas!\n" test_support mkdir "$PATH_SAV/forum/$DATE/" # tu n'avais pas protégé le chemin echo 'Connexion au serveur ftp et copie des fichiers...' # je suis psychorigide wget -r -c ftp://utilisateur:motdepasse@url.fr/* -P "$PATH_SAV/forum/$DATE/" # protection if [ $? -ne 0 ] # plus simple on travail sur des entier et pas des chaînes then echo 'Des avertissements sont survenus lors du transfert!' exit 1 fi echo 'Compression des fichiers' tar -cvjf "$DATE.tar.bz" "$PATH_SAV/trux/$DATE/forum/*" # protection if [ $? -ne 0 ] then echo "Des avertissements sont survenus lors de la compression!" exit 2 fi rm -rf "/$PATH_SAV/forum/$DATE" # protection mv "$DATE.tar.bz" "$PATH_SAV/forum/" # protection echo 'La sauvegarde est terminée. Aucun incident à déplorer...' # psychorigidité exit }

Pour session_kill tu peut modifier le teste sur 0.

La structure de contrôle switch ça sauve les bébés phoques (et j’ai remis les choix dans l’ordre) :

function menu_first { echo -e "\n\n\n\n??????????????????????????????????????????????????????????????????????????????" echo -e "==============> Que voulez-vous faire? <==============\n" echo -e "1- Mise à jour 2- Sauvegarde système 3-Sauvegarde forum \n4- Nettoyage 5- Tuer une session \n9- Quitter\n" echo 'Saisissez votre choix puis "ENTRÉE":' read choix case $choix in 1) update ;; 2) sauvegarde_systeme ;; 3) sauvegarde_forum ;; 4) echo "Le nettoyage n'a pas encore été implémenté!" menu_first ;; 5) session_kill ;; 9) exit ;; *) echo 'Choix erroné' ;; esac }

Et tente de remplacer bash par sh dans le shaban.

Au lieu de créer une variable $user initialisée avec whoami tu peut utiliser la variable d’environnement $USER. Pareil pour la variable $machine que tu peut remplacer par la variable $HOST.

Enfin, il faudrait regarder les performances, mais peut être que tu peu remplacer :

tar -cvjf "$DATE.tar.bz" "$PATH_SAV/trux/$DATE/forum/*" mv "$DATE.tar.bz" "$PATH_SAV/forum/"
par

Mais là je te conseil de faire un bench selon comment travail tar il peu ne pas être pertinent de faire ça ($PATH_SAV pointe sur un disque dure externe c’est bien ça ?). Tu a vraiment besoin de l’option v ? Elle limite les performances.

Merci pour ces conseils!

Pour les utilisations spécifiques des tests, tu m’aides bien car je n’avais pas encore tout intégré (ça se voyait).

Pour les “” et les ‘’, c’est sûrement pas plus mal d’être psychorigide, surtout quand le script grossit.

Le contrôle switch, c’est sublime versus mon menu à la MacGyver.

C’est plus universel. J’avais mis en bash pour tester quelque chose qui ne fonctionnait pas, mais impossible de me souvenir pourquoi. Je vais retenter en sens inverse.

EDIT: Si je mets /bin/sh je prends un message ‘function: not found’.

Il me semblait bien que ça existait, impossible de m’en rappeler sur le coup!

[quote=“MisterFreez”]Enfin, il faudrait regarder les performances, mais peut être que tu peu remplacer :
Code:
tar -cvjf “$DATE.tar.bz” “$PATH_SAV/trux/$DATE/forum/*”
mv “$DATE.tar.bz” “$PATH_SAV/forum/”

par
Code:
tar -cvjf “$PATH_SAV/forum/$DATE.tar.bz” “$PATH_SAV/trux/$DATE/forum/*”

Mais là je te conseil de faire un bench selon comment travail tar il peu ne pas être pertinent de faire ça ($PATH_SAV pointe sur un disque dure externe c’est bien ça ?). Tu a vraiment besoin de l’option v ? Elle limite les performances.[/quote]

Alors, pour le v, c’est un peu un réflexe avec tar. Mais je vire, inutile dans le contexte.

Pour la compression directe sur le disque externe, je suis dans le même cas que celui évoqué dans SD avec des lenteurs de transfert sur disque USB, donc pour le moment je laisse ainsi.

En tous cas, merci encore! :023

[quote=“Arthur”]C’est plus universel. J’avais mis en bash pour tester quelque chose qui ne fonctionnait pas, mais impossible de me souvenir pourquoi. Je vais retenter en sens inverse.

EDIT: Si je mets /bin/sh je prends un message ‘function: not found’.[/quote]
C’est normal le mot clef fonction n’est pas POSIX.

Au lieu de définir tes fonctions comme ça :

function coucou { echo 'salut' }
fait ainsi

coucou () { echo 'salut' }

Merci, ça marche mieux d’un coup en /bin/sh. Et je préfère comme cela!

Bon, il aime moins les echo -e mais je devrais m’en sortir!

bonsoir,

la forme
pipeline
if [ $? -eq 0 ]
then

fi

peut être condensée en : pipeline && {

}

de même pipeline
if [ $? -ne 0 ]
then

fi

comme ceci : pipeline || {

}

ou ! pipeline && {

}

Par contre, la forme if [ $? -ne 0 ]
then

else

fi

peut dans la majorité des cas être remplacée par
pipeline && {

} || {

}

Mais comme il y a des situations où cela peut ne pas être le cas, il y a la forme
pipeline && {

:
} || {

}
qui gère tous les cas :wink:

exemple de situation ou ça ne fonctionne pas

[ a = a ] && {
echo yes
[ a = b ] && echo "pas bon"
} || {
echo nop
}

et je vous laisse faire le test en rajoutant la ligne avec “:”

si pipeline renvoie des infos vers le terminal --> rajouter >&/dev/null au pieline !

enfin : pour le echo -e “…\n”, utilise printf “…\n\n” à la place

J’ai découvert seulement récemment les && et || mais je n’ai pas pris le coup pour les utiliser.

Et merci aussi pour printf!

@Totor > J’aime pas trop les trucs du genre cmd && … qui sont, je trouve moins lisibles. Je m’en sert uniquement pour des cas vraiment petits genre (d’une seule ligne) :

[quote=“MisterFreez”]Alors le test pourrais être simplifié en plus tu as déjà mis le chemin dans une variable autant l’utiliser :

function test_support { ls /media/HERCULE/save if [ $? != "0" ] then echo "Le support de sauvegarde n'est pas monté!" echo -e "Retour au menu\n" menu_first fi }
comme ça

function test_support { if [ -d "$PATH_SAV" ] then echo "Le support de sauvegarde n'est pas monté!" echo -e "Retour au menu\n" menu_first fi }[/quote]

Je n’avais pas fini de tester et je ne m’en rends compte que maintenant, mais le test serait plutôt:

function test_support { if [ [b]![/b] -d "$PATH_SAV" ] then echo "Le support de sauvegarde n'est pas monté!" echo -e "Retour au menu\n" menu_first fi }

Vu qu’on ne sort que si le répertoire n’existe pas.