Manipuler les chaines en Bash

Publié le 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.

comments powered by Disqus