Variables bash

De system.co.free.fr.
(Différences entre les versions)
(Suppression de la plus courte chaîne recherché, en partant du début)
(Définir une variable uniquement si elle est indéfinie ou nul)
 
(27 versions intermédiaires masquées)
Ligne 1 : Ligne 1 :
-
==Variables bash==
+
=Variables bash=
-
Manipulations des variables en Bash
+
Extrait de [https://www.patpro.net/blog/index.php/2006/04/07/20-manipulations-sur-les-variables-dans-bash/ https://www.patpro.net/blog/index.php/2006/04/07/20-manipulations-sur-les-variables-dans-bash/]
-
Les exemples ci-dessous sont réalisés avec une variable nommée '''VAR'''.
+
Manipulations des variables en Bash
 +
<br>
 +
Les exemples ci-dessous sont réalisés avec une variable nommée '''VAR'''.<br>
 +
le caractère générique "*", peut être utilisé, et remplace 1 ou plusieurs caractères différents.<br>
-
===Longueur en caractères===
+
==Longueur de la variable==
<pre>
<pre>
VAR=azerty  
VAR=azerty  
Ligne 12 : Ligne 15 :
<pre>6</pre>
<pre>6</pre>
-
===Nombre éléments d'un tableau===
+
==Nombre éléments d'un tableau==
<pre>
<pre>
VAR=( un deux trois quatre )
VAR=( un deux trois quatre )
Ligne 19 : Ligne 22 :
<pre>4</pre>
<pre>4</pre>
-
===Longueur d'un élément d'un tableau===
+
==Longueur d'un élément d'un tableau==
<pre>
<pre>
VAR=( un deux trois quatre )
VAR=( un deux trois quatre )
Ligne 26 : Ligne 29 :
<pre>2</pre>
<pre>2</pre>
-
===supprimer les n premiers caractères (1er caractère = numero 0 )===
+
==supprimer les n premiers caractères (1er caractère = numero 0 )==
{| class="wikitable"
{| class="wikitable"
|chaine caracteres || a || z || e || r || t || y
|chaine caracteres || a || z || e || r || t || y
Ligne 39 : Ligne 42 :
<pre>rty</pre>
<pre>rty</pre>
-
===extraire une chaine de caractères en partant du debut===
+
==extraire une chaine de caractères en partant du debut==
avec ${Variable:debut:longueur} <br>
avec ${Variable:debut:longueur} <br>
debut=3<br>
debut=3<br>
Ligne 58 : Ligne 61 :
<pre>rtyu</pre>
<pre>rtyu</pre>
-
===extraire une chaine de caractères avec un position en partant de la fin===
+
==extraire une chaine de caractères avec un position en partant de la fin==
avec ${Variable:fin:longueur} <br>
avec ${Variable:fin:longueur} <br>
Ligne 78 : Ligne 81 :
<pre>ertyu</pre>
<pre>ertyu</pre>
-
===Suppression de la plus courte chaîne recherché, en partant du début===
+
==Suppression de la plus courte chaîne recherché, en partant du début==
Ligne 96 : Ligne 99 :
azetyU
azetyU
</pre>
</pre>
 +
<br>
 +
le caractère "*" est un caractère générique qui remplace 1 ou plusieurs caractères differents.
<br>
<br>
<pre>
<pre>
Ligne 104 : Ligne 109 :
TYUIOPQSD
TYUIOPQSD
</pre>
</pre>
-
la caractère "*" est le caractère générique qui remplace tous les caractères.
+
<br>
-
 
+
[AB] signifie le caractère A ou le caractère B<br>
-
 
+
[AB[AB][AB][AB] signifie 4 caractères ( A ou B) qui se suivent
-
 
+
<br>
 +
<pre>
VAR=ABABAB_TOTO
VAR=ABABAB_TOTO
-
echo ${VAR#[AB][AB][AB][AB]} # AB_TOTO
+
echo ${VAR#[AB][AB][AB][AB]}
 +
</pre>
 +
<pre>
 +
AB_TOTO
 +
</pre>
 +
<br>
-
===Suppression de la plus longue chaine, a partir du début===
+
==Suppression de la plus longue chaine, a partir du début==
<pre>
<pre>
Ligne 121 : Ligne 132 :
</pre>
</pre>
-
===Recherche et suppression de la plus courte chaine en partant de la fin===
+
==Recherche et suppression de la plus courte chaîne en partant de la fin==
-
 
+
 +
<pre>
VAR=abcABC123ABCabc
VAR=abcABC123ABCabc
-
echo ${VAR%b*c} # abcABC123ABCa
+
echo ${VAR%b*c}
 +
</pre>
 +
<pre>
 +
abcABC123ABCa
 +
</pre>
-
- Suppression du plus long morceau correspondant, en partant de la fin de la chaîne ${VAR%%recherche}:
+
==Suppression de la plus longue chaîne en partant de la fin==
 +
${VAR%%recherche}:
 +
 +
<pre>
VAR=abcABC123ABCabc
VAR=abcABC123ABCabc
-
echo ${VAR%%b*c} # a
+
echo ${VAR%%b*c}
 +
</pre>
 +
<pre>
 +
a
 +
</pre>
-
Bien chercher-remplacer dans sa variable.
+
==chercher et remplacer une sous-chaîne dans une variable==
-
Bash propose aussi 4 types de remplacement dans le contenu des variables.
+
Il y a 2 possibilités: la première occurrence ou toutes les occurrences:
-
Ces remplacements peuvent se faire sur la première occurrence trouvée, ou sur toutes les occurrences. Les syntaxes suivantes gèrent respectivement ces deux cas :
+
<pre>
-
 
+
${VAR/recherche/remplacé par} # première occurrence
-
${VAR/recherche/remplacement} # première occurrence
+
${VAR//recherche/remplacé par} # toutes les occurrences
-
${VAR//recherche/remplacement} # toutes les occurrences
+
</pre>
-
 
+
<br>
-
Dans tous les cas, c'est le morceau le plus grand correspondant à "recherche" qui sera remplacé. Ainsi, on aura :
+
Dans tous les cas, c'est la sous-chaîne la plus grande correspondant à "recherche" qui sera remplacée. <br>
 +
<pre>
 +
VAR=abcABC123ABCabc
 +
echo ${VAR/b*c/Z}
 +
</pre>
 +
<pre>
 +
aZ
 +
</pre>
 +
===chercher et remplacer la première sous-chaîne d'une variable===
 +
<pre>
VAR=abcABC123ABCabc
VAR=abcABC123ABCabc
-
echo ${VAR/b*c/Z} # aZ
+
echo ${VAR/#abc/---}
-
 
+
</pre>
-
On peut aussi viser spécifiquement le début ou la fin d'une chaîne :
+
<pre>
 +
---ABC123ABCabc
 +
</pre>
 +
===chercher et remplacer dernière sous-chaîne d'une variable===
 +
<pre>
VAR=abcABC123ABCabc
VAR=abcABC123ABCabc
-
echo ${VAR/#abc/---} # ---ABC123ABCabc
+
echo ${VAR/%abc/---}
-
echo ${VAR/%abc/---} # abcABC123ABC---
+
</pre>
 +
<pre>
 +
abcABC123ABC---
 +
</pre>
-
Bien définir sa variable.
+
==Renvoyer une valeur de substitution lorsque la variable n'existe pas==
-
Pour les cas où les variables doivent être étroitement surveillées, on dispose de quelques outils permettant par exemple de leur donner une valeur par défaut, ou de retourner une erreur quand elles ne sont pas définies.
+
si VAR est défini (avec une valeur ou avec nul), on retourne sa valeur, y compris nul, sinon, si VAR est indéfini, on retourne défaut, sans changer ni la valeur, ni l’état de VAR.  
 +
<pre>
 +
unset VAR                # on supprime VAR si elle existe
 +
echo ${VAR-defaut}
 +
</pre>
 +
<pre>
 +
defaut
 +
</pre>
-
On sait déjà que la forme ${VAR} retourne la valeur de VAR. Mettons maintenant qu'on veuille utiliser une valeur par défaut quand la valeur de VAR n'est pas définie. On peut écrire : ${VAR-defaut}. dans ce cas, si VAR existe (nulle ou pas), on retourne sa valeur, sinon, on retourne la valeur defaut, sans changer la valeur de VAR.
+
Si l'on souhaite que la valeur retournée soit non nul, on peut utiliser la syntaxe : <b>${VAR:-defaut}</b>.
-
 
+
-
Si on veut que la valeur retournée soit non nulle, on peut utiliser la syntaxe : ${VAR:-defaut}.
+
Par exemple :
Par exemple :
 +
<pre>
 +
declare VAR # VAR existe, mais est nul
 +
echo ${VAR-valeur_par_defaut}
 +
</pre>
 +
<pre>
-
declare VAR # VAR existe, mais est nulle
+
</pre>
-
echo ${VAR-valeur_par_defaut} # rien
+
<pre>
-
echo ${VAR:-valeur_par_defaut} # valeur_par_defaut
+
echo ${VAR:-valeur_par_defaut}
 +
</pre>
 +
<pre>
 +
valeur_par_defaut
 +
</pre>
-
unset VAR # VAR n'est plus définie
 
-
echo ${VAR-valeur_par_defaut} # valeur_par_defaut
 
-
echo ${VAR:-valeur_par_defaut} # valeur_par_defaut
 
-
Donc, si null est une valeur possible pour une variable, il convient d'utiliser la syntaxe ${VAR-defaut} qui respectera la valeur nulle. Sinon, il est plus sage d'utiliser ${VAR:-defaut}.
 
-
Il faut bien ce souvenir que cette syntaxe ne défini à aucun moment la valeur de VAR. C'est le rôle de la syntaxe ci dessous de définir VAR si elle n'est pas définie :
+
Pour substituer une valeur (ici une chaîne: defaut) a une variable indéfinie:<br>
 +
<pre>
 +
${VAR-defaut}
 +
</pre>
 +
<br>
 +
Pour substituer une valeur (ici une chaîne: defaut) a une variable indéfinie ou nul: <br>
 +
<pre>
 +
${VAR:-defaut}
 +
</pre>
 +
<br>
 +
Cette syntaxe ne défini pas ou ne modifie pas la valeur de VAR.
-
declare VAR # VAR existe, mais est nulle
+
==Définir une variable uniquement si elle est indéfinie==
-
echo ${VAR=valeur_par_defaut} # rien, VAR reste nulle
+
définir VAR si elle n'est pas définie :<br>
-
echo ${VAR:=valeur_par_defaut} # VAR prend la valeur
+
<pre>
-
# valeur_par_defaut
+
unset VAR # VAR n'est pas défini
 +
echo ${VAR=valeur_par_defaut}
 +
</pre>
 +
<pre>
 +
valeur_par_defaut
 +
</pre>
 +
<br>
 +
==Définir une variable uniquement si elle est indéfinie ou nul==
 +
définir VAR lorsque nul :<br>
 +
<pre>
 +
VAR=               # défini VAR a nul
 +
echo ${VAR:=valeur_par_defaut}
 +
</pre>
 +
<pre>
 +
valeur_par_defaut
 +
</pre>
 +
<br>
-
Si on veut maintenant utiliser une autre valeur, fixe, quand VAR est définie, sans pour autant modifier la valeur réelle de VAR, on peut procéder comme cela :
+
==remplacer momentanément la valeur d'une variable non nul==
VAR=valeur_1
VAR=valeur_1
Ligne 194 : Ligne 268 :
echo ${VAR?pas definie} # rien, valeur nulle autorisée
echo ${VAR?pas definie} # rien, valeur nulle autorisée
echo ${VAR:?valeur nulle} # -bash: VAR: pas definie (sur stderr)
echo ${VAR:?valeur nulle} # -bash: VAR: pas definie (sur stderr)
-
 
-
Bon, j'ai conscience que cela est plutôt indigeste, n'hésitez pas à poser vos questions et faire part de vos remarques.
 

Version actuelle en date du 8 novembre 2020 à 08:15

Sommaire

Variables bash

Extrait de https://www.patpro.net/blog/index.php/2006/04/07/20-manipulations-sur-les-variables-dans-bash/

Manipulations des variables en Bash
Les exemples ci-dessous sont réalisés avec une variable nommée VAR.
le caractère générique "*", peut être utilisé, et remplace 1 ou plusieurs caractères différents.

Longueur de la variable

VAR=azerty 
echo ${#VAR} 
6

Nombre éléments d'un tableau

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

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

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

supprimer les n premiers caractères (1er caractère = numero 0 )

chaine caracteres a z e r t y
numero de caractère 0 1 2 3 4 5
VAR=azerty
echo ${VAR:3}
rty

extraire une chaine de caractères en partant du debut

avec ${Variable:debut:longueur}
debut=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 t y u
VAR=azertyuiop
echo ${VAR:3:4}
rtyu

extraire une chaine de caractères avec un position en partant de la fin

avec ${Variable:fin:longueur}
fin=(-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 - - -
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 caracteres 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 - - -
resultat 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

Recherche et 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 valeur de substitution lorsque la variable n'existe pas

si VAR est défini (avec une valeur ou avec nul), on retourne sa valeur, y compris nul, sinon, si VAR est indéfini, on retourne défaut, sans changer ni la valeur, ni l’état de VAR.

unset VAR                # on supprime VAR si elle existe
echo ${VAR-defaut}	
defaut

Si l'on souhaite que la valeur retournée soit non nul, on peut utiliser la syntaxe : ${VAR:-defaut}.

Par exemple :

declare VAR			# VAR existe, mais est nul
echo ${VAR-valeur_par_defaut}

echo ${VAR:-valeur_par_defaut}
valeur_par_defaut


Pour substituer une valeur (ici une chaîne: defaut) a une variable indéfinie:

${VAR-defaut}


Pour substituer une valeur (ici une chaîne: defaut) a une variable indéfinie ou nul:

${VAR:-defaut}


Cette syntaxe ne défini pas ou ne modifie pas la valeur de VAR.

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

définir VAR si elle n'est pas définie :

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


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

définir VAR lorsque nul :

VAR= 		               # défini VAR a nul
echo ${VAR:=valeur_par_defaut}	
valeur_par_defaut


remplacer momentanément la valeur d'une variable non nul

VAR=valeur_1 echo ${VAR+autre_valeur} # autre_valeur VAR= # null echo ${VAR+autre_valeur} # autre_valeur echo ${VAR:+autre_valeur} # rien

Dernier cas maintenant : on veut utiliser la valeur de VAR, mais on veut retourner un message d'erreur si la valeur est nulle ou si VAR n'est pas définie. On peut alors procéder comme cela :

unset VAR # VAR n'est pas définie echo ${VAR?pas definie} # -bash: VAR: pas definie (sur stderr)

VAR= # définie mais vide, null echo ${VAR?pas definie} # rien, valeur nulle autorisée echo ${VAR:?valeur nulle} # -bash: VAR: pas definie (sur stderr)

Outils personnels