Exile on Keyboard St. - Blog sur Linux et Debian

Aller au contenu | Aller au menu | Aller à la recherche

Tag - script Shell

Fil des billets - Fil des commentaires

vendredi 7 avril 2017

Bien utiliser les tableaux en bash

Le bash, Bourne Again Shell, offre une possibilité absente du Bourne Shell, à savoir la possibilité de déclarer facilement des tableaux.

On s'intéressera ici aux tableaux indexés uniquement.

Pour déclarer un tableau, rien de plus simple:

#!/bin/bash

colours=(black blue green white red yellow)

Maintenant pour afficher tous les éléments en une fois:

echo "colours_elements=${colours[@]}"

colours_elements=black blue green white red yellow

Pour afficher la troisième couleur, située à l'indice 2:

echo "green=${colours[2]}"
green=green

Le nombre d'élements du tableau:

echo "colours_count=${#colours[@]}"
colours_count=6

Pour boucler sur chaque valeur:

for colour in ${colours[@]}; do
    ...
done

Et pour afficher la troisième couleur en partant de la fin du tableau:

echo "${colours[-3]}"
white

Enfin bash permet aussi de lire un fichier dans un tableau avec la built-in mapfile.

mercredi 5 octobre 2016

Trouver de la documentation pour se former au scripting et à Bash

Lorsqu'on commence à écrire un script Shell sous Linux ou que l'on va devoir en maintenir un écrit depuis longtemps, on a souvent besoin de vérifier certaines syntaxes et parfois aussi envie de prendre le temps d'en découvrir d'autres.

Une simple recherche Google telle que "test string comparison shell" ne suffit pas toujours.

Mais alors quelles ressources consulter pour approfondir notre connaissance du Shell Linux et plus précisément de Bash, puisque c'est souvent ce dernier qu'on utilise désormais ?

La première réponse qui vient à l'esprit est évidemment:

Première méthode: RTFM !

man bash

Maintenant que https://manpages.debian.org/ n'est plus en ligne, on est quitte pour revenir au bon vieux terminal !

Deuxième méthode: Le site de GNU

On peut évidemment aussi consulter le manuel de Bash sur le site de GNU, mais l'avantage de la manpage contrairement au site de GNU c'est qu'elle est traduite dans ma langue, c'est à dire en Français ! D'où l'intérêt d'installer Linux en Français ...

Il y a aussi des ressources précieuses sur le site The Linux Documentation Project, par exemple:

Troisième méthode: The Linux Documentation Project

Le Bash Guide for Beginners est comme son nom l'indique conseillé aux novices du Bash. Son défaut évident est qu'il commence à dater puisqu'il est de 2008.

Toujours sur The Linux Documentation Project, vous trouverez un document beaucoup plus détaillé, à savoir le Advanced Bash-Scripting Guide qui est plus détaillé que le précédent, a un sommaire qui nous oriente facilement et en plus est plus à jour !

Quatrième méthode: Un bouquin !

Eh oui, les livres ça existe encore et des fois il y a aussi des nouvelles éditions !!! C'est le cas du Bash Pocket Reference de l'éditeur O'Reilly qui vient d'être ré-édité à un prix très raisonnable.

Si vous n'avez pas envie de débourser un centime, vous pouvez aussi vous tourner vers le livre de Michel Scifo, LES SCRIPTS AVEC LE SHELL BASH, qui présente les avantages suivants:

  1. Il est publié sous une license libre
  2. Il est récent
  3. Il est gratuit
  4. Il est en Français
  5. Il comporte des exercices

Enfin, il est recommandé par framboise314 !

Cinquième méthode: Un lint pour le Shell

C'est pas le tout d'écrire des scripts Bash, mais la syntaxe utilisée est-elle toujours correcte ? Pas de panique, l'outil Shellcheck est là, il existe en tant que paquet Debian et si vous voulez l'installer, tout est décrit ici dans un précédent post sur Shellcheck et la vérification de syntaxe en Shell.

vendredi 9 septembre 2016

Boucler sur une liste de valeurs en Shell

On va s'intéresser aujourd'hui à la boucle en Shell pour parcourir une liste de valeurs.

Imaginons un outil en ligne de commande qui permette de contrôler un démon ou un processus serveur. Cet outil devra être capable de gérer les commandes suivantes:

  • start
  • stop
  • status
  • restart

Pour afficher l'aide de l'outil, on va donc parcourir les commandes possibles et notre ébauche de code ressemblera à:

for command in start stop status restart; do
    echo "$command: ..."
done

qui pour l'instant affichera:

start: ...
stop: ...
status: ...
restart: ...

Comme la liste des commandes possibles est codé en dur dans le code, on va améliorer le code comme ceci:

commands="start stop status restart"
for command in $commands; do
    echo "$command: ..."
done

A l’exécution, le résultat est le même: on passe bien 4 fois dans la boucle.

Si maintenant je modifie légèrement le code en:

...
for command in "$commands"; do
    echo "$command: ..."
done

J'obtiens le résultat (surprenant ?) suivant:

start stop status restart: ...

On ne passe plus qu'une fois dans la boucle !!!

En effet, le fait de "quoter" la référence à la variable commands désactive la séparation des mots (word splitting) et la boucle ne voit qu'une commande !

Cela revient à faire:

for command in "start stop status restart"; do
    echo "$command: ..."
done

Ce qui n'est pas ce que l'on veut.

L'utilisation d'un outil de vérification de Scripts Shell comme ShellCheck nous aurait d’ailleurs signalé l'erreur:

for command in "$commands"; do
               ^-- SC2066: Since you double quoted this, it will not word split, and the loop will only run once.

dimanche 24 juillet 2016

Définir un valeur par défaut pour la builtin read de Bash

La builtin read de bash permet à l'utilisateur de saisir des informations depuis un script Shell.

Par exemple:

read value

On peut aussi afficher un prompt précisant ce que l'utilisateur doit entrer au clavier:

read -p "Enter the input file path: " file_path

Mais il est souvent également nécessaire de définir une valeur par défaut de telle sorte que si celle-ci convient à l'utilisateur il n'a qu'à appuyer sur Entrée:

read -p "Enter the folder path: " -e -i /tmp folder_path

qui affiche:

Enter the folder path: /tmp

Cela se fait avec le flag -i de la builtin read qui nécessite également le flag -e (pour utiliser l'interface readline).

La documentation complète des builtin de bash se trouve ici: https://www.gnu.org/software/bash/manual/html_node/Bash-Builtins.html.

On peut aussi consulter le Linux Documentation Project.

- page 1 de 4