# Votre avis sur un script bash

**URL:** <https://www.debian-fr.org/t/votre-avis-sur-un-script-bash/32535>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 2:28 UTC](https://www.debian-fr.org/t/votre-avis-sur-un-script-bash/32535 "2016-02-21T02:28:20Z")\
**Posts on this page:** 9\
**Page:** 1

<div class="post-metadata">

**Author:** ![Arthur](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/958977/32.png) [@Arthur](https://www.debian-fr.org/u/Arthur)\
**Post date:** [Février 21, 2016, 2:28 UTC](https://www.debian-fr.org/t/votre-avis-sur-un-script-bash/32535/1 "2016-02-21T02:28:20Z")

</div>

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](http://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](http://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.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:28 UTC](https://www.debian-fr.org/t/votre-avis-sur-un-script-bash/32535/2 "2016-02-21T02:28:21Z")

</div>

C’est avec plaisir que je vais relire ça 🙂

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

```auto

```

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.

---

<div class="post-metadata">

**Author:** ![Arthur](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/958977/32.png) [@Arthur](https://www.debian-fr.org/u/Arthur)\
**Post date:** [Février 21, 2016, 2:28 UTC](https://www.debian-fr.org/t/votre-avis-sur-un-script-bash/32535/3 "2016-02-21T02:28:24Z")

</div>

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 «&nbsp;&nbsp;» et les ‹&nbsp;&nbsp;›, 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.

> [@MisterFreez](#):
>
> Et tente de remplacer bash par sh dans le shaban.

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 ‹&nbsp;function: not found&nbsp;›.

> [@MisterFreez](#):
>
> 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.

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

[quote=«&nbsp;MisterFreez&nbsp;»]Enfin, il faudrait regarder les performances, mais peut être que tu peu remplacer :  
Code:  
tar -cvjf «&nbsp;$DATE.tar.bz&nbsp;» «&nbsp;$PATH\_SAV/trux/$DATE/forum/\*&nbsp;»  
mv «&nbsp;$DATE.tar.bz&nbsp;» «&nbsp;$PATH\_SAV/forum/&nbsp;»

par  
Code:  
tar -cvjf «&nbsp;$PATH\_SAV/forum/$DATE.tar.bz&nbsp;» «&nbsp;$PATH\_SAV/trux/$DATE/forum/\*&nbsp;»

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](https://www.debian-fr.org/uploads/default/original/1X/3c587556c0cc11389317c03a60788d77ceebd307.gif "OK")

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:28 UTC](https://www.debian-fr.org/t/votre-avis-sur-un-script-bash/32535/4 "2016-02-21T02:28:26Z")

</div>

[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'
}`

---

<div class="post-metadata">

**Author:** ![Arthur](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/958977/32.png) [@Arthur](https://www.debian-fr.org/u/Arthur)\
**Post date:** [Février 21, 2016, 2:28 UTC](https://www.debian-fr.org/t/votre-avis-sur-un-script-bash/32535/5 "2016-02-21T02:28:27Z")

</div>

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!

---

<div class="post-metadata">

**Author:** ![Totor](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/t/58f4c7/32.png) [@Totor](https://www.debian-fr.org/u/Totor)\
**Post date:** [Février 21, 2016, 2:28 UTC](https://www.debian-fr.org/t/votre-avis-sur-un-script-bash/32535/6 "2016-02-21T02:28:39Z")

</div>

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 😉

exemple de situation ou ça ne fonctionne pas

```auto
[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

---

<div class="post-metadata">

**Author:** ![Arthur](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/958977/32.png) [@Arthur](https://www.debian-fr.org/u/Arthur)\
**Post date:** [Février 21, 2016, 2:28 UTC](https://www.debian-fr.org/t/votre-avis-sur-un-script-bash/32535/7 "2016-02-21T02:28:39Z")

</div>

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!

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:28 UTC](https://www.debian-fr.org/t/votre-avis-sur-un-script-bash/32535/8 "2016-02-21T02:28:41Z")

</div>

@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) :

```auto

```

---

<div class="post-metadata">

**Author:** ![Arthur](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/958977/32.png) [@Arthur](https://www.debian-fr.org/u/Arthur)\
**Post date:** [Février 21, 2016, 2:29 UTC](https://www.debian-fr.org/t/votre-avis-sur-un-script-bash/32535/9 "2016-02-21T02:29:06Z")

</div>

[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.
