Appliquer la notion

On souhaite améliorer le script suivant.

1
#!/bin/bash
2
3
cp camera/*.png $1/
4
count=$(ls $1 | wc -l)
5
echo "Il y a $count photos dans le dossier"

Ce script copie tout les fichiers .png se trouvant dans le dossier camera vers un dossier de destination, puis compte le nombre de fichiers dans le dossier de destination pour l'afficher. Le dossier de destination est déterminé pour le premier argument envoyé au script.

1
$ ./script.sh photos

Question

Que se passe-t-il si l'on oublie de donner le dossier de destination en argument au lancement du script ?

Solution

Si l'on ne spécifie pas d'argument, la variable $1 est vide. Le script donne donc ceci :

1
#!/bin/bash
2
3
cp camera/*.png /
4
count=$(ls | wc -l)
5
echo "Il y a $count photos dans le dossier"

Ce qui revient à copier les photos à la racine du système de fichier puis à compter les fichiers dans le dossier où se trouve le script. Il est fort probable que l'on n'ai pas les permissions pour copier les fichiers dans le dossier racine /, et on va ensuite compter le mauvais dossier, ce n'est pas vraiment ce que l'on souhaite...

Question

À l'aide des conditions, adaptez le script pour vérifier que l'argument a bien été donné au script, et sinon utilisez un dossier de destination par défaut nommé photos.

Solution

Il y a plusieurs solutions envisageables, mais la plus judicieuse est de créer une variable nommée dossier et de l'utiliser pour nos opérations. En début de script, on vérifie si la variable $1 est correctement remplie : si c'est le cas on l'assigne à la variable dossier, sinon on assigne le nom du répertoire par défaut à la variable dossier.

1
#!/bin/bash
2
3
if [ -z $1 ]
4
then
5
  dossier="photos"
6
else
7
  dossier=$1
8
fi
9
10
cp camera/*.png $dossier/
11
count=$(ls $dossier | wc -l)
12
echo "Il y a $count photos dans le dossier"
13