MagPI 12 Page 32
Sommaire |
2 - Textes et programmes embarqués
DIFFICULTÉ : MOYENNE
Solution du défi
Comment vous en êtes-vous sorti avec le problème du Numéro 10 ? En voici une solution :
#!/bin/bash # Un script pour gzipper tous les fichiers du répertoire # de travail actuel. Il exclut les fichiers gzip qui se # terminent par .gz. for file in $(find $PWD -maxdepth 1 -type f | grep -v . gz); do gzip $file done
Bash (Bourne Again Shell) fournit beaucoup de fonctionnalités, mais l'un de ses points forts est la façon dont d'autres programmes ou langages de scripts peuvent lui être liés pour produire une application finale.
Fichiers embarqués
Ouvrez un terminal et lancez l'éditeur nano vu dans l'article précédent. Créez ensuite un nouveau fichier contenant le script :
#!/bin/bash cat > input_file.txt <<EOF ColumnA_row1 ColumnB_row1 ColumnC_row1 ColumnD_row1 ColumnA_row2 ColumnB_row2 ColumnC_row2 ColumnD_row2 ColumnA_row3 ColumnB_row3 ColumnC_row3 ColumnD_row3 ColumnA_row4 ColumnB_row4 ColumnC_row4 ColumnD_row4 EOF
enregistrez-le et rendez-le exécutable (chmod u+x script.sh). Lancez son exécution et regardez dans le fichier input_file.txt qu'il a généré. Son contenu correspond au texte saisi entre les marques <<EOF et EOF. Pour que ce script fonctionne, il ne doit pas y avoir d'espace après <<EOF . Sa syntaxe indique que le texte qui suit <<EOF est redirigé vers le fichier input_file.txt jusqu'à ce que EOF soit atteint. L'opérateur de redirection (>) fonctionne comme mentionné dans le précédent tutoriel, tronquant le fichier de sortie et écrivant dedans ensuite. La syntaxe <<EOF peut être très utile pour intégrer des portions de fichiers de configuration dans un script, plutôt que d'utiliser de nombreuses commandes echo.
Scinder des lignes en entrée
Si un fichier est lu avec une boucle for classique, chacun des mots (séparés par un ou plusieurs espaces) deviendra une valeur dans cette boucle. Cela peut aider pour certains problèmes, mais le numéro de ligne est perdu. La commande read apporte une solution :
#!/bin/bash while read line; do for word in $line; do echo -n "$word " done echo "" done < input_file.txt
Dans cet exemple, la boucle externe lit chaque ligne du fichier dans la variable $line. Ensuite, dans la boucle interne, chaque mot d'une ligne est traité par la boucle for. Le -n de la commande echo permet de ne pas ajouter de caractère de nouvelle ligne après l'affichage. Le fichier en entrée est associé à la boucle while grâce à la redirection de l'entrée (<).