Exile on Keyboard St. - Blog sur Linux et Debian

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

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.

jeudi 19 janvier 2017

Vérifier (proprement) si un volume est monté ou non

Sous Linux, les disques durs amovibles et autres clés USB peuvent être montés de manière automatique ou non.

Lorsque ces derniers sont utilisés à des fins de sauvegarde on a besoin de vérifier si le média de sauvegarde est disponible ou non.

Imaginons que notre disque externe de sauvegarde soit monté sur /media/backup, une première façon de vérifier si on peut procéder à la sauvegarde consiste à vérifier si le répertoire de montage est vide:

mount_point="/media/external-backup"

Puis:

if [ "$(ls -A $mount_point)" ]; then
    echo "Backup disk is present."
fi

ça n'est pas très élégant mais cela fonctionne.

On peut aussi "parser" la sortie standard de la commande mount:

if mount | grep $mount_pount >/dev/null; then
    echo "Backup disk is present."
fi

C'est déjà un peu plus propre mais on peut faire encore mieux. En effet, la commande mountpoint est là pour cela:

if mountpoint -q $mount_point; then
    echo "Backup disk is present."
fi

Je vous fait grâce des méthodes (sales) qui consistent à parser les fichier /etc/mtab ou /procs/mounts.

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.

lundi 22 août 2016

Les résultats de le commande ping avec un timestamp

La commande ping qui permet de tester la présence d'une machine envoie une requête par seconde et écrit sur la sortie standard quelque chose comme:

ping Freebox-Server.local
PING Freebox-Server.local (192.168.0.254) 56(84) bytes of data.
64 bytes from Freebox-Server.local (192.168.0.254): icmp_req=1 ttl=64 time=4.23 ms
64 bytes from Freebox-Server.local (192.168.0.254): icmp_req=2 ttl=64 time=3.31 ms
64 bytes from Freebox-Server.local (192.168.0.254): icmp_req=3 ttl=64 time=3.36 ms
64 bytes from Freebox-Server.local (192.168.0.254): icmp_req=4 ttl=64 time=3.32 ms

On peut modifier cet intervalle d'une seconde:

ping -i 60 Freebox-Server.local

Par contre on ne dispose pas de la date et de l'heure de chaque requête sur la sortie à l'écran.

Certes on peut utiliser le flag -D pour afficher le timestamp Unix:

ping -D -i 60 Freebox-Server.local
PING Freebox-Server.local (192.168.0.254) 56(84) bytes of data.
[1471846085.423179] 64 bytes from Freebox-Server.local (192.168.0.254): icmp_req=1 ttl=64 time=3.65 ms
[1471846145.587672] 64 bytes from Freebox-Server.local (192.168.0.254): icmp_req=2 ttl=64 time=3.40 ms

Mais ce n'est pas très parlant pour un être humain !

On pourrait certes obtenir ensuite la date par:

date -d @1471846085
lundi 22 août 2016, 08:08:05 (UTC+0200)

Mais cela ne simplifie pas les choses.

En fait, pour obtenir le timestamp sur la sortie de la commande ping, il ne faut pas se focaliser sur la commande ping elle-même mais il suffit de parser sa sortie. Par exemple:

ping Freebox-Server.local | while read line; do echo "$(date): $line"; done
lundi 22 août 2016, 08:11:21 (UTC+0200): PING Freebox-Server.local (192.168.0.254) 56(84) bytes of data.
lundi 22 août 2016, 08:11:21 (UTC+0200): 64 bytes from Freebox-Server.local (192.168.0.254): icmp_req=1 ttl=64 time=3.30 ms
lundi 22 août 2016, 08:11:22 (UTC+0200): 64 bytes from Freebox-Server.local (192.168.0.254): icmp_req=2 ttl=64 time=3.39 ms
lundi 22 août 2016, 08:11:23 (UTC+0200): 64 bytes from Freebox-Server.local (192.168.0.254): icmp_req=3 ttl=64 time=3.32 ms

En faisant comme cela, on peut ajouter les informations de date et d'heure sur la sortie de n'importe quelle commande et ce simplement par quelques commandes Shell.

- page 1 de 5