Manipulation de chaîne de caractères Linux

Assigner et afficher une variable

En BASH, une variable est identifiée par l’usage du ‘$’, sauf pour lui attribuer une valeur où l’on omet le ‘$’.

#assignation de la variable
96386@kws:~$ maVariable='Ceci est une chaine de caractères'
    
#utilisation de la variable
96386@kws:~$ echo $mavariable
Ceci est une chaine de caractères

Il est également possible d’utiliser une syntaxe plus explicite qui permet de délimiter clairement quel est le nom de la variable et d’éviter donc plus facilement des erreurs de nommage.

96386@kws:~$ file='homework'
96386@kws:~$ ls /mnt/data/$file_save.doc

Dans cet exemple la variable utilisée est ‘file_save’ et non ‘file’. Le résultat ne sera donc absolument pas celui qu’on attend !

Une façon de délimiter clairement le nom de la variable est d’utiliser les crochets ‘{}’.

    96386@kws:~$ file='homework'
    96386@kws:~$ ls /mnt/data/${file}_save.doc

La variable utilisée ici sera ‘file’ et a pour valeur ‘homework’. Ce qui donne donc la commande suivante une fois la variable substituée.

96386@kws:~$ ls /mnt/data/homework_save.doc

C’est cette syntaxe qui sera utilisée tout au long de cet article.

Modifier la casse

Un des traitements les plus courants est de modifier la casse, que cela soit de passer tout en majuscule, ou en minuscule.

Tout passer en minuscule

Le changement de la casse en minuscule se fait à l’aide de ‘,,’ comme ceci :

96386@kws:~$ test="Hello World !"
96386@kws:~$ echo ${test,,}
hello world !

Tout passer en majuscule

Le changement de la casse en majuscule se fait à l’aide de ‘^^’ comme ceci :

96386@kws:~$ test="Hello World !"
96386@kws:~$ echo ${test^^}
HELLO WORLD !

Ainsi un ‘case’ comme celui-ci

case ${userInput} in
    "oui"|"Oui"|"OUI"|"O"|"o"|"YES"|"Yes"|"yes"|"Y"|y")
        # action si l'utilisateur répond oui
        ;;
    "non"|"Non"|"NON"|"NO|"No"|"no"|"N"|"n")
        # action si l'utilisateur répond non
        ;;
esac

devient simplement :

case ${userInput,,} in
    "oui"|"yes"|"y"|"o")
        # action si l'utilisateur répond oui
    ;;
    "non"|"no"|"n")
        # action si l'utilisateur répond non
    ;;
esac

Récupérer la longueur de la chaine de caractère.

Pour récupérer la longueur d’une chaine de caractère il suffit de précéder le nom de la variable par ‘#’ comme ceci :

${#variable}

96386@kws:~$ VAR="Chaine d'une certaine longueur"
96386@kws:~$ echo ${#VAR}
30

Taille d’un tableau

Il est possible d’obtenir le nombre d’éléments d’un tableau de la façon suivante :

96386@kws:~$ unset VAR
96386@kws:~$ VAR[0]="blablabla"
96386@kws:~$ VAR[1]="azeaze"
96386@kws:~$ VAR[2]="test"
96386@kws:~$ VAR[3]="someText"
96386@kws:~$ VAR[4]=48
96386@kws:~$ VAR[5]=98985
96386@kws:~$ echo ${#VAR[*]}
6
96386@kws:~$ echo ${#VAR[@]}
6

Attention à ne pas oublier les crochets, sinon # retournera simplement la longueur du premier élément du tableau.

96386@kws:~$ unset VAR
96386@kws:~$ VAR[0]="blablabla"
96386@kws:~$ VAR[1]="azeaze"
96386@kws:~$ VAR[2]="test"
96386@kws:~$ echo ${#VAR}
9

Déterminer le nombre de paramètre passés au script

Pour connaitre le nombre de paramètres passés au script ($1, $2 …) on utilisera ‘${#*}’ et ‘${#@}

96386@kws:~$ vi test.sh
#!/bin/bash
echo "\${#*} : '${#*}' \${#@} : '${#@}'"
    
    
96386@kws:~$ bash test.sh var1 test something
${#*} : '3' ${#@} : '3'

Assignation des variables

Plutôt que d’utiliser des ‘if’, ‘else’ et d’assigner des valeurs par défaut si les variables sont vides il existe des mécanismes permettant l’usage ou l’assignation d’une valeur alternative pour ces variables.

Utiliser une alternative

La formulation ${var-alternative} permet l’utilisation d’une alternative si la variable n’est pas assignée

96386@kws:~$ unset VAR # on s'assure que la variable n'existe pas/plus
96386@kws:~$ echo "var: '${VAR-"default"}'"
var: 'default'
96386@kws:~$ VAR=""
96386@kws:~$ echo "var: '${VAR-"default"}'"
var: ''
96386@kws:~$ VAR="VALUE"
96386@kws:~$ echo "var: '${VAR-"default"}'
var: 'VALUE'

96386@kws:~$ VAR2="someVar"
96386@kws:~$ unset VAR
96386@kws:~$ echo ${VAR-$VAR2}
someVar

On constate que si la variable existe mais ne contient aucun caractère, elle n’est pas remplacée par la valeur de substitution. Pour spécifier à Bash que les variables vides sont également à remplacer nous allons utiliser la forme suivante : ${var:-alternative} (ajout du ‘:’).

96386@kws:~$ unset VAR # on s'assure que la variable n'existe pas/plus
96386@kws:~$ echo "'${VAR:-"default"}'"
'default'
96386@kws:~$ VAR=""
96386@kws:~$ echo "'${VAR:-"default"}'
'default'
96386@kws:~$ VAR="VALUE"
96386@kws:~$ echo "'${VAR:-"default"}'"
'VALUE' 
96386@kws:~$ VAR2="someVar"
96386@kws:~$ VAR=""
96386@kws:~$ echo ${VAR:-$VAR2}
someVar

Assigner une valeur par défaut

La méthode précédente permettait de retourner une valeur différente lors de l’usage de la variable mais la valeur de la variable restait inchangée. La syntaxe ${var= »alternativeValue »} permet de d’assigner une valeur à la variable si celle ci n’est pas déclarée .

96386@kws:~$ unset VAR # on s'assure que la variable n'existe pas/plus
96386@kws:~$ echo "var :'$VAR'"
var :''
96386@kws:~$ echo "var :'${VAR=default}'"
var :'default'
96386@kws:~$ echo "var :'$VAR'"
var :'default'

Comme pour l’utilisation d’une valeur de substitution, il est possible de différencier une variable non assignée d’une variable vide. ${VAR:=default} permet de remplacer la valeur des variables déclarée mais vides.

96386@kws:~$ VAR=""
96386@kws:~$ echo "var :'$VAR'"
var :''
96386@kws:~$ echo "var :'${VAR=default}'"
var :''
96386@kws:~$ echo "var :'$VAR'"
var :''
96386@kws:~$ echo "var :'${VAR:=default}'"
var :'default'
96386@kws:~$ echo "var :'$VAR'"
var :'default'

Utiliser une alternative et quitter

Toujours dans la liste des valeurs alternatives, il est possible d’utiliser une valeur par défaut et de quitter le programme avec un code de de retour ‘1’. La formulation est la suivante : ${var?alternative]

96386@kws:~$ unset var
96386@kws:~$ parametre=${VAR?"Var is not set"}
bash: VAR: Var is not set

La formulation reste la même pour spécifier que l’on souhaite aussi filtrer les variables définies mais vides : ${var:? »Var is not set or empty »}

96386@kws:~$ var=""
96386@kws:~$ parametre=${VAR:?"Var is not set or empty"}
-bash: var: Var is not set or empty

Extraire une sous-chaine

Il est courant de travailler sur des fractions d’une chaine de caractères. Il est possible d’obtenir ses éléments avec la fonction suivante : ${var:<position>:<longueur>}

96386@kws:~$ VAR="Hello world !"
96386@kws:~$ echo "'${VAR:6}'"
'world !'
96386@kws:~$ echo "'${VAR:1:4}'"
'ello'
96386@kws:~$ echo "'${VAR:6:20}'"
'world !'
96386@kws:~$ echo "'${VAR::3}'"
'first 3'
96386@kws:~$ echo "'${VAR: -3}'"
'd !'
96386@kws:~$ echo "'${VAR::-1}'"
'Hello world '

Supprimer une sous-chaine

Il est possible de se débarrasser rapidement de chaine de caractères précédant ou suivant la partie recherchée, pour récupérer le nom d’un fichier sans les répertoires auquel il appartient ou sans son extension par exemple !

‘#’ Supprimer depuis le début de la chaine

L’utilisation du ‘#’ (${var#pattern}) permet de supprimer la première portion correspondant au pattern que l’on passe en paramètre.

96386@kws:~$ VAR="hello world !"
96386@kws:~$ echo "'${VAR#h*o}'"
' world !'.

##

Le double ‘#’ (${var##pattern) s’utilise de la même façon que le simple ‘#’ à la différence que celui-ci supprimera la chaine correspondante la plus longue.

96386@kws:~$ VAR="hello world !"
96386@kws:~$ echo "'${VAR##h*o}'"
'rld !'

‘%’ Supprimer depuis la fin de la chaine

Le ‘%’ (${var%pattern}) permet de supprimer la chaine correspondante à notre pattern depuis la fin de notre variable

96386@kws:~$ VAR="hello world !"
96386@kws:~$ echo "'${VAR%o*}'"
'hello w'

%%

Comme pour le ‘##’ le double %% permet de sélectionner la plus grande chaine, ici depuis la fin de la variable.

96386@kws:~$ VAR="hello world !"
96386@kws:~$ echo "'${VAR%%o*}'"
'hell'

A noter que ces outils ne permettent la suppression de chaine de caractères que depuis l’un des bords de la variable.

Pour supprimer une sous-chaine présente au milieu de la variable on pourra utiliser de remplacement de chaine de caractère ‘/’ sans lui passer de chaine de remplacement. Pour supprimer la première occurence :

96386@kws:~$ VAR="hello world !"
96386@kws:~$ echo "'${VAR/o/}'"
'hell world !'
96386@kws:~$ VAR="hello world !"
96386@kws:~$ echo "'${VAR/l*o/}'"
'herld !'

Pour supprimer l’ensemble des occurrences on utilisera ‘//’

96386@kws:~$ VAR="hello world !"
96386@kws:~$ echo "'${VAR//o/}'"
'hell wrld !'

Exemple d’utilisation

Les traitements de chaines de caractère que nous voulons voir sont très pratiques lorsque, par exemple, de la manipulation de fichiers. Prenons ici comme exemple le fichier ‘/etc/apache2/sites-available/000-default.conf’ et regardons ensemble comment extraire le path, le nom du fichier et son extension.

96386@kws:~$ file='/etc/apache2/sites-available/000-default.conf'

Pour récupérer le path, nous allons simplement tout supprimer depuis la fin du fichier jusqu’au premier ‘/’ rencontré

96386@kws:~$ file='/etc/apache2/sites-available/000-default.conf'
96386@kws:~$ filePath=${file%/*}
96386@kws:~$ echo $filePath 
/etc/apache2/sites-available

Pour récupérer le fichier, nous allons procéder de la façon inverse : nous allons tout supprimer depuis le début jusqu’au dernier ‘/’

96386@kws:~$ file='/etc/apache2/sites-available/000-default.conf'
96386@kws:~$ fileName=${file##*/}
96386@kws:~$ echo $fileName 
000-default.conf

Pour supprimer l’extension de notre fichier nous allons supprimer tout les caractères depuis la fin jusqu’au premier ‘.’

96386@kws:~$ file='/etc/apache2/sites-available/000-default.conf'
96386@kws:~$ fileNameShort=${fileName%.*}
96386@kws:~$ echo $fileNameShort 
000-default

Et enfin pour extraire l’extension nous allons garder uniquement ce qu’il reste après le dernier ‘.’

96386@kws:~$ file='/etc/apache2/sites-available/000-default.conf'
96386@kws:~$ fileExtension=${fileName##*.}
96386@kws:~$ echo $fileExtension 
conf

Remplacement de sous-chaine

En plus des possibilités de suppression et d’extraction de sous-chaine de caractère, il est également possible de remplacer certaines expressions dans notre variable avec l’utilisation du ‘/’.

Remplacer le premier élément trouvé.

Pour remplacer le première élément correspondant, on utilisera la syntaxe suivante :${var/pattern/remplacement/}.

96386@kws:~$ VAR="blablabla"
96386@kws:~$ echo "'${VAR/a/o}'"
'bloblabla'
96386@kws:~$ echo "'${VAR/bl/pl}'"
'pliblablobleblu'
96386@kws:~$ echo "'${VAR/bla/123}'"
'bli123blobleblu'

Remplacer l’ensemble des éléments correspondants.

Pour remplacer l’ensemble des éléments correspondants par la chaine passé en deuxième paramètre nous utiliserons le double ‘/’.

${string//substring/replacement}

96386@kws:~$ VAR="blablabla"
96386@kws:~$ echo "'${VAR//a/o}'"
'blobloblo'
96386@kws:~$ VAR="bliblablobleblu"
96386@kws:~$ echo "'${VAR//bl/pl}'"
'pliplaplopleplu'

Remplacer le dernier élément correspondant.

Pour remplacer la plus grande correspondance depuis le début de la chaine on utilisera le ‘/#’

${string/#substring/replacement}

96386@kws:~$ var="Hello, world !"
96386@kws:~$ echo "'${var/#*o/i}'"
'irld !'

Ce qui est similaire à ‘/’

96386@kws:~$ echo "'${VAR/*o/i}'"
'irld !'

Pour remplacer la plus longue correspondance depuis la fin de la chaine de caractère, on utilisera le ‘/%’

${string/%substring/replacement}

96386@kws:~$ var="Hello, world !"
96386@kws:~$ echo "'${var/%o/i}'"
'Hello, world !'
96386@kws:~$ echo "'${var/%o*/il}'"
'Helli'

Ce qui est similaire à ‘/’

96386@kws:~$ echo "'${VAR/o*/i}'"
'irld !'

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *