======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
{| border="2" style="text-align: center; font-weight: bold;"
! style="width: 25%"| 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\\
{| border="2" style="text-align: center; font-weight: bold;"
! style="width: 25%"| 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\\
{| border="2" style="text-align: center; font-weight: bold;"
! style="width: 25%"| 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=====
{| border="2" style="text-align: center; font-weight: bold;"
! style="width: 25%"| 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