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
resultat=${PWD##*/}
avec ${#Variable}
VAR=azerty echo ${#VAR}
6
avec ${#Tableau[@]}
VAR=( un deux trois quatre ) echo ${#VAR[@]}
4
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
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 |
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
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
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
VAR=ABCABC123ABCabc echo ${VAR##A*C}
abc
VAR=abcABC123ABCabc echo ${VAR%b*c}
abcABC123ABCa
${VAR%%recherche}:
VAR=abcABC123ABCabc echo ${VAR%%b*c}
a
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
VAR=abcABC123ABCabc echo ${VAR/#abc/---}
---ABC123ABCabc
VAR=abcABC123ABCabc echo ${VAR/%abc/---}
abcABC123ABC---
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
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 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 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
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
VAR= echo ${VAR:+autre_valeur}
resultat:
# vide
VAR=TOTO echo ${VAR:+autre_valeur}
resultat:
TOTO
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
TOTO="" echo ${TOTO:?valeur nulle} -bash: TOTO: valeur nulle #sortie sur stderr unset TOTO echo ${TOTO:?indefine} -bash: TOTO: indefine #sortie sur stderr
x="TOTO" echo ${x,,} toto
Si la chaîne est déjà en minuscule, pas de modification.
x="TOTO EST DANS LA CUISINE" echo ${x,,O} ToTo EST DANS LA CUISINE
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
x="TOTO" echo ${x^^} toto
Si la chaîne est déjà en majuscule, pas de modification.
x="toto" echo ${x^} Toto
si le 1e caractère est déjà en majuscule, pas de modification.
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.
x="ToTo est Dans lA cUisInE" echo ${x~~} tOtO EST dANS La CuISiNe
x="ToTo est Dans lA cUisInE" echo ${x~} toTo est Dans lA cUisInE