Table des matières

Variables chaîne de caractères

Retour a la ligne dans une variable

https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC-Quoting.html
l'expression $' devant une chaîne permet d'y insérer des caractères d'échappements en les précédents de \.
https://www.gnu.org/software/bash/manual/html_node/Locale-Translation.html
l'expression $“ devant une chaîne convertira les caractères dans leurs forme locale.

TOTO=$"ligne1\nligne2\nligne3\n"
echo -e $TOTO
ligne1
ligne2
ligne3
TOTO='ligne1
ligne2
ligne3'
echo ${TOTO%%$'\n'*} 
ligne1
TOTO=$"ligne1\nligne2\nligne3\n"
echo ${TOTO%%$"\n"*} 
ligne1

Récupérer uniquement le nom du répertoire courant sans le chemin absolu

resultat=${PWD##*/}

Longueur d'une variable

avec ${#Variable}

VAR=azerty 
echo ${#VAR} 
6

Nombre éléments d'un tableau

avec ${#Tableau[@]}

VAR=( un deux trois quatre )
echo ${#VAR[@]}
4

Longueur d'un élément d'un tableau

Les éléments d'un tableau sont numérotés en commençant a 0 pour le 1er élément.
avec ${#Tableau[n]}

VAR=( un deux trois quatre )
echo ${#VAR[2]}
5

Renvoi la sous-chaîne a partir du nième caractère

Les caractères d'une chaîne sont numérotés en commençant a 0 pour le 1er caractère.
renvoi la sous chaîne à partir du nième caractère et jusqu’à la fin.
Avec ${Chaine:n}

VAR=azerty
echo ${VAR:3}
rty

chaîne caractères a z e r t y
numéro de caractère 0 1 2 3 4 5
résultat r t y

Extraire une sous-chaîne de caractères en partant du début

Les caractères d'une chaîne sont numérotés en commençant a 0 pour le 1er caractère.
avec ${Chaîne:début:longueur}
début=3
longueur=4

chaine caracteres a z e r t y u i o p
numero de caractère 0 1 2 3 4 5 6 7 8 9
decompte de la longueur - - - 1 2 3 4 - - -
résultat r t y u

VAR=azertyuiop
echo ${VAR:3:4}
rtyu

Extraire une sous-chaîne de caractères en partant de la fin

Les éléments d'une chaîne peuvent être numéroté en commençant par le dernier caractère. Dans ce cas, on compte en nombre négatif en commençant par le dernier caractère à (-1)
Dernier caractère à (-1).
Avant dernier caractère à (-2).

avec ${Chaîne:(-début):longueur}
(-début)=(-8)
longueur=5

chaine caracteres a z e r t y u i o p
numero de caractère -10 -9 -8 -7 -6 -5 -4 -3 -2 -1
decompte de la longueur - - 1 2 3 4 5 - - -
résultat e r t y u

VAR=azertyuiop
echo ${VAR:(-8):5}
ertyu

Suppression de la plus courte chaîne recherché, en partant du début

chaine caractères a z e r E c h e r c h e t y U
recherche et suppression - - - r E c h e r c h e - - -
résultat a z e t y U


VAR=azerEcherchetyu
${VAR#rEcherche}
azetyU


le caractère “*” est un caractère générique qui remplace 1 ou plusieurs caractères differents.

VAR=AZERTYUIOPQSD
echo ${VAR#A*R}		# A*R correspond ici a AZER
TYUIOPQSD


[AB] signifie le caractère A ou le caractère B
[AB[AB][AB][AB] signifie 4 caractères ( A ou B) qui se suivent

VAR=ABABAB_TOTO
echo ${VAR#[AB][AB][AB][AB]}
AB_TOTO


Suppression de la plus longue chaine, a partir du début

VAR=ABCABC123ABCabc
echo ${VAR##A*C}
abc

suppression de la plus courte chaîne en partant de la fin

VAR=abcABC123ABCabc
echo ${VAR%b*c}	
abcABC123ABCa

Suppression de la plus longue chaîne en partant de la fin

${VAR%%recherche}:

VAR=abcABC123ABCabc
echo ${VAR%%b*c}
a

Chercher et remplacer une sous-chaîne dans une variable

Il y a 2 possibilités: la première occurrence ou toutes les occurrences:

${VAR/recherche/remplacé par}	# première occurrence
${VAR//recherche/remplacé par}	# toutes les occurrences


Dans tous les cas, c'est la sous-chaîne la plus grande correspondant à “recherche” qui sera remplacée.

VAR=abcABC123ABCabc
echo ${VAR/b*c/Z}
aZ

Chercher et remplacer la première sous-chaîne d'une variable

VAR=abcABC123ABCabc
echo ${VAR/#abc/---}	
---ABC123ABCabc

chercher et remplacer dernière sous-chaîne d'une variable

VAR=abcABC123ABCabc
echo ${VAR/%abc/---}	
abcABC123ABC---

Renvoyer une chaîne lorsque la variable est non définie

Cette syntaxe ne défini pas ou ne modifie pas la valeur de VAR.
si VAR est défini (avec une valeur ou avec nulle), on retourne sa valeur, y compris nulle, sinon, si VAR est indéfini, on retourne la chaîne choisi, ici “défaut”, sans définir la variable

unset VAR                # on supprime VAR si elle existe
echo ${VAR-défaut}	
defaut
echo ${VAR}
   # vide

Mais si la variable a été déclaré (même sans contenu)

declare VAR  # ou declare VAR=""   => VAR existe, mais est nulle
echo ${VAR-défaut}
   # vide

Renvoyer une chaîne lorsque la variable est non définie ou nulle

Cette syntaxe ne défini pas ou ne modifie pas la valeur de VAR.
Pour retourner une valeur (ici une chaîne: defaut) a une variable indéfinie ou nulle, on peut utiliser la syntaxe :
${VAR:-defaut}.

declare VAR="" # ou unset VAR, ou declare VAR  
echo ${VAR:-defaut}
valeur_par_defaut

Définir une variable uniquement si elle est indéfinie

définir VAR si elle est indéfinie avec ${VAR=Chaîne}

unset VAR			# VAR n'est pas défini
echo ${VAR=valeur_par_defaut}	
valeur_par_defaut
echo ${VAR}
valeur_par_defaut


Définir une variable uniquement si elle est indéfinie ou nulle

définir VAR lorsqu'elle est nulle ou indefinie avec ${VAR:=Chaîne}

VAR= 		                       # défini VAR a nulle
echo ${VAR:=valeur_par_defaut}	
valeur_par_defaut
unset VAR		               # indéfinir VAR
echo ${VAR:=valeur_par_defaut}	
valeur_par_defaut


retourner une chaîne si une variable est définie

unset VAR
echo echo ${VAR+autre_valeur}

résultat:

# vide
VAR=valeur_1
echo ${VAR+autre_valeur}

résultat:

autre_valeur
VAR=				# vide
echo ${VAR+autre_valeur}	

resultat:

autre_valeur

retourner une chaîne si une variable est non vide

VAR=
echo ${VAR:+autre_valeur}	

resultat:

   # vide
VAR=TOTO
echo ${VAR:+autre_valeur}	

resultat:

TOTO

message d'erreur si une variable est indéfini

le message est renvoyé sur la sortie d'erreurs standard stderr avec un code retour 1.

unset TOTO			# TOTO n'est pas définie
echo ${TOTO?pas définie}		
-bash: TOTO: pas définie	# message sur stderr
echo $?
1
TOTO=                           # TOTO est définie mais vide = nulle
echo ${TOTO?pas definie}	
   # vide, valeur nulle autorisée
echo $?
0

message d'erreur si une variable est nulle ou indéfini

TOTO=""
echo ${TOTO:?valeur nulle}	
-bash: TOTO: valeur nulle #sortie sur stderr
unset TOTO
echo ${TOTO:?indefine}	
-bash: TOTO: indefine     #sortie sur stderr

Conversion en minuscule

x="TOTO"
echo ${x,,}
toto

Si la chaîne est déjà en minuscule, pas de modification.

Conversion en minuscule d'une lettre de la chaîne

x="TOTO EST DANS LA CUISINE"
echo ${x,,O}
ToTo EST DANS LA CUISINE

Conversion en minuscule de plusieurs lettres de la chaîne

x="TOTO EST DANS LA CUISINE"
echo ${x,,[OTAU]}
toto ESt DaNS La CuISINE
 
#ou pour un intervalle
echo ${x,,[A-N]}
TOTO eST danS la cUiSine
 
#ou pour plusieurs intervalles
echo ${x,,[A-EN-RS-Z]}
toto est dans La cuIsIne

Conversion en majuscule

x="TOTO"
echo ${x^^}
toto

Si la chaîne est déjà en majuscule, pas de modification.

Premier caractère en majuscule

x="toto"
echo ${x^}
Toto

si le 1e caractère est déjà en majuscule, pas de modification.

Premier caractère en minuscule

x="ToTo est Dans lA cUisInE"
echo ${x,}
toTo est Dans lA cUisInE

si le 1e caractère est déjà en minuscule, pas de modification.

Inverse la case de la chaîne

x="ToTo est Dans lA cUisInE"
echo ${x~~}
tOtO EST dANS La CuISiNe

Inverse la case du 1e caractère, et ne modifie pas les autres

x="ToTo est Dans lA cUisInE"
echo ${x~}
toTo est Dans lA cUisInE