Appliquer la notion
On souhaite améliorer le script suivant.
cp camera/*.png $1/
count=$(ls $1 | wc -l)
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.
$ ./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 :
cp camera/*.png /
count=$(ls | wc -l)
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
.
if [ -z $1 ]
then
dossier="photos"
else
dossier=$1
fi
cp camera/*.png $dossier/
count=$(ls $dossier | wc -l)
echo "Il y a $count photos dans le dossier"