Manipuler les chaines en Bash

09/10/2009

Je continue ma série d’articles sur le scripting bash. Il y a des milliers de choses à connaître et vous n’avez pas finit d’être étonné. Aujourd’hui je vais vous parler un peu des manipulations possibles de bash sur des chaines contenues dans des variables. En effet, plutôt que de passer par “awk” ou “sed” à chaque fois pour des opérations de simples substitution ou de découpe, il suffira de connaitres les “built-in” de Bash qui permettent pas mal d’opérations.

En premier lieu, voyons comment nous pouvons faire une sous-chaîne entre deux position de caractères.

foo="abracadabra"
echo "la chaine est $foo"
echo ${foo:3:5}

Le résultat est le suivant:

la chaine est abracadabra
racad

La syntaxe est en fait très simple, il suffit de faire:

${nomDeVariable:debut:nombreDeCaractères}

En d’autres termes, \${foo:3:5} retourne 5 caractères de la chaine contenu dan \$foo à partir du 3ième caractère. Simple et efficace :)

Outre les sous-chaines (substring ou substr) existent des extensions de variables très intéressantes, comme par exemple la matching. Imaginons que nous ayons un nom de fichier “foo_bar.tar.gz”. Voici ce que nous pouvons en sortir:

foo="foo_bar.tar.gz"

echo ${foo#*.}
>tar.gz

echo ${foo##*.}
>gz

Peut-être est-ce un peu plus complexe mais en réalité c’est assez simple. “#” veut dire, dans le contexte de variable, que nous cherchons dans la chaine depuis le début. La recherche s’arrête à la chaine la plus courte jusqu’à tomber sur un point “.”. En doublant le “#” (donc avec ##), cela signifie que nous cherchons la chaine la plus longue jusqu’à ce que nous arrivons à un point.

Donc dans le premier cas, nous avons enlevé la chaine la plus courte avant un point, soit “foo_bar”, dans le second cas c’est la chaine la plus longue: “foo_bar.tar”. C’est pratique pour trouver une extension de fichier :)

Si # correspond au début, le symbole % correspond à la fin. Ainsi:

foo="foo_bar.tar.gz"

echo ${foo%*.}
>gz

echo ${foo%%*.}
>tar.gz

Vous l’avez compris, c’est exactement pareil, mais à partir de la fin.

Reste alors les opérations arithmétique possibles par Bash. Seuls les nombres entiers fonctionnent, dans le cas des nombres décimaux je vous invite à utiliser la commande bc. Les opération arithmétique se déposent dans le contexte double parenthèse:

$(())

Ainsi:

foo=3
echo $foo+7
>3+7

echo $((foo+7))
>10

Les opérateurs possibles sont: + - * / %, où “%” correspond au modulo (reste de la division entière).

Bref, tout ça pour vous dire que, sans imaginer développer des logiciels très complexes, la puissance de Bash peut vous amener à développer des scripts assez complet, riches et fonctionnels.

La prochaine fois je tenterai de vous parler de “menu bash”. En attendant, éclatez vous sur vos scripts.

Ça peut vous intéresser aussi


Pool de thread en bash

Créer un pool de thread est une opération toujours un ...


Sauvegarde automatisé en Bash

On m’a demandé hier soir sur un canal IRC ...


La commande deux-points en Bash

Que ce soit en bash, en sh, en ce que ...


Optimisons un peu notre Linux en limitant les accès disques

Que vous ayez un SSD ou non, je pense que ...

Merci de m'aider à financer mes services

Si vous avez apprécié cet article, je vous serai reconnaissant de m'aider à me payer une petite bière :)

Si vous voulez en savoir plus sur l'utilisation de flattr sur mon blog, lisez cette page: Ayez pitié de moi

Commentaires

Ajouter un commentaire

Ajouter un commentaire

(*) Votre e-mail ne sera ni revendu, ni rendu public, ni utilisé pour vous proposer des mails commerciaux. Il n'est utilisé que pour vous contacter en cas de souci avec le contenu du commentaire, ou pour vous prévenir d'un nouveau commentaire si vous avez coché la case prévue à cet effet.