Exile on Keyboard St. - Blog sur Linux et Debian

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

mercredi 18 octobre 2017

Bien utiliser les tableaux en bash: les tableaux associatifs

Dans un billet précédent, on a vu comment bien utiliser les tableaux en bash. Il s'agissait des tableaux indexés dont l'indice est un entier comme dans beaucoup de langages.

Mais Bash permet aussi la définition de tableaux associatifs dans lesquels l'indice est une chaîne de caractères et non plus un entier.

Pour reprendre l'exemple des couleurs:

declare -A colours

colours[black]=noir
colours[red]=rouge
colours[green]=vert

Vous remarquerez le flag -A au lieu de -a utilisé pour le tableau indexé.

Pour lister les valeurs du tableau associatif:

for colour in "${colours[@]}"; do
    echo "$colour"
done
rouge
vert
noir

Maintenant si je veux faire le parcours en partant des clés:

for colour in "${!colours[@]}"; do
    echo "$colour: ${colours[$colour]}"
done

Ce qui donne:

red: rouge
green: vert
black: noir

La syntaxe est donc exactement la même qu'avec les tableaux indexés excepté qu'ici la clé est une chaîne de caractères et que l'utilisation des crochets tient lieu de double quotes: la clé peut donc contenir des espaces.

On peut aussi affecter un tableau en une seule instruction:

data=([joe]=30 [mary]=25)

vendredi 7 avril 2017

Bien utiliser les tableaux en bash: les tableaux indexés

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

declare -a colours
colours=(black blue green white red yellow)

Le mot clé "declare" avec le flag -a, bien que facultatif, précise que la variable colours est un tableau indexé.

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.

lundi 31 octobre 2016

Ajouter un copyright sur une photo publiée en ligne avec Linux

Quand on publie des photos en ligne, celles-ci peuvent être reprises par n'importe qui, lequel peut alors affirmer en être l'auteur. Pour éviter qu'un tiers mal intentionné utilise des photos qui sont les vôtres, vous pouvez certes les publier dans une résolution faible mais cette solution n'en est pas vraiment une.

Afin d'éviter le "vol" de vos clichés, vous pouvez avoir envie d'apposer sur celles-ci un Copyright, c'est à dire un texte qui indique votre nom ainsi que le nom du site sur lesquelles vous les publiez. Ainsi il sera plus difficile aux importuns de vous "piquer" vos photos.

On a vu récemment comment réduire la qualité d'une image .jpg en ligne de commande avec le paquet imagemagick, on va maintenant utiliser ce même paquet Linux pour apposer un Copyright sur une image .jpg.

Prenons l'image suivante de la Mairie de Tours:

IMG_20161020_131510455.jpg

Utilisons la ligne de commande suivante:

convert tours.jpg -draw "gravity center text 0,0 'Copyright © 2013-2016 - www.onkeyboardst.net'" tours2.jpg

qui va ajouter le texte 'Copyright © 2013-2016 - www.onkeyboardst.net' au milieu de l'image. Si vous essayez, vous verrez que c'est à peine visible. Il nous faut donc utiliser une police de caractères plus grande:

convert tours.jpg -pointsize 48 -draw "gravity center text 0,0 'Copyright © 2013-2016 - www.onkeyboardst.net '" tours3.jpg

On obtient alors l'image suivante:

tours3.jpg

Le copyright est visible au niveau des fenêtres du premier étage.

Maintenant si je souhaite que le texte du Copyright soit plus grand, parce que là c'est quand même encore trop petit, et placé en diagonale de l'image:

convert tours.jpg -pointsize 72 -draw "gravity center rotate 45 text 0,0 'Copyright © 2013-2016 - www.onkeyboardst.net '" tours4.jpg

Et le résultat est:

tours4.jpg

Cette façon de faire avec la commande convert et son flag -draw n'en est qu'une parmi d'autres, mais qui a le mérite de faire ce que l'on souhaite.

Ceci étant dit, les commandes du paquet imagemagick sont très puissantes mais les lignes de commande correspondantes ne sont pas forcément faciles à appréhender !

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.

dimanche 25 septembre 2016

Réduire la qualité d'une image .jpg en ligne de commande sous Linux

Les photos prises avec les téléphones portables modernes ou les appareils photos numériques ont un poids en Mo de plus en plus élevé.

Pourtant, on a souvent besoin d'envoyer à quelqu'un une photo pour information, c'est à dire que la qualité de la photo importe peu dans notre démarche. Dans ce cas, c'est plus sympa que la photo pèse 250Ko plutôt que 5Mo !

Le paquet imagemagick sous Linux propose plusieurs lignes de commande pour traiter les images.

Par exemple, avec la commande mogrify je peux réduire le poids, c'est à dire la place occupée sur le disque, d'une image prise avec mon téléphone comme ceci:

mogrify -quality 50 Téléchargements/IMG_20160923_090158547.jpg

Attention: Par défaut, la commande mogrify modifie le fichier initial et n'en fait pas de copie. Pour définir un répertoire de sortie, on peut utiliser l'option -path output_path de mogrify.

On peut aussi utiliser la commande convert comme suit:

convert -quality 50 Téléchargements/IMG_20160923_090158547.jpg Téléchargements/IMG_20160923_090158547-new.jpg

Les commandes mogrify et convert acceptent évidemment beaucoup d'autres options décrites dans leurs manpages respectives.

- page 1 de 4