Joseph Tux
Shell BASH

Opérateur « variable » : ${}

dimanche 5 juillet 2009

à l’intérieur de ${ ... }

nom:debut:longueur    sous-chaine
#nom            Longueur de la chaine
nom#motif     Supprime le début de chaine (supression minimale)
nom##motif   Supprime le début de chaine ( supression maximale)
nom%motif    Supprime la fin de chaine ( supression minimale )
nom%%motif   Supprime la fin de chaine (supression maximale )
nom/motif/chaine  Remplace 1 occurence par chaine
nom//motif/chaine Remplace toute occurence par chaine

BASES

Cet article n’épuise pas les fonctions du $ , mais seulement celles de ${}
( par exemple, l’opérateur arithmétique $(( )) , l’opérateur $( commande ), ne sont pas traités )

SYNTAXE DE L’OPERATEUR ${} [1]

  • La syntaxe $var ;
  • est une facilité de ${var} ;

L’ opérateur ${} doit répondre à une fonction : ’=’ (affectation), ’echo’, ’printf’ (affichage) ou ’ :’ = ne rien faire !( mais le faire !!! ).

  • Ici il la commande ’ :’ ( ne fait rien ) est utile.

Utilisation des joker : * [2] et ? [3] et des classes de caractères [ ] [4], + échappement : * ~? et \ .

VARIABLES SCALAIRES

TRAITEMENTS DE CHAINE :

EXTRACTION :

${var:5:2}      extraire 2 caractères à partir du N°5 (= le 6ème:  1er=N°0 ).
${var:12}       extraire tout à partir du 13ème caractère.
${var#motif}    variable amputée de motif -minimal- en début de chaine.
${var##motif}   variable amputée de motif -maximal- en début de chaine.
${var%motif}    variable amputée de motif -minimal- en fin de chaine.
${var%%motif}   variable amputée de motif -maximal- en fin de chaine.

REMPLACEMENT :

${var/motif/chaîne} renvoie var, en remplaçant motif -minimal- par chaîne.
${var//motif/chaîne renvoie var, en remplaçant motif -maximal- par chaîne.

TRAITEMENT A PROPOS DE LA CHAINE :

${#var}         Donne la longueur de la chaine.
${var:-valeur}  Valeur par défaut: renvoie 'valeur', si var est vide ou indéfinie.
${var:=valeur}  Contenu par défaut: Affecte 'valeur' à 'var', si var est vide ou indéfinie.

Exemple pour ces 2 derniers traitements : - [5] - [6]

// a et b n'existent pas:
$ echo "1 ${a:-defaut} ${b:=assure}" && echo "2 a= ${a} ; b= ${b}"
1  defaut assure
2 a=  ; b= assure
// a n'existe pas, b contient "assure"
  • ${var:?'message'} Renvoie ’message’ si la variable est vide ou indéfinie et interrompt. [7]
  • ${var:+'existe'} Renvoie ’existe’ si var est définie et non vide ; si le paramètre est vide ou inexistant ne renvoie rien.

Exemple :

$ a='' ; echo 'Résultat:' && echo "${a:-vide}" && echo "a=$a" && echo "${a:=nouv}" && echo ${a:+'existe'} && echo ${#a}
Résultat:
vide
a=
nouv
existe
4

VARIABLES TABLEAUX

Une valeur scalaire peut simplement être considérée comme un tableau à 1 élément :

a="original"
'echo $a'

affiche « original ».

'echo ${a[0]}
affiche aussi « original ».

tableau[i]=valeur
 : Affectation de ’valeur’ à un élément i du tableau. [8]

a[2]="nouveau"
var=${a[2]}

 : Affectation de « nouveau » au 3e élément du tableau « a ».

tableau[cle1]="valeur"
echo ${tableau[cle1]}     # affiche: "valeur"

 : Affectation de « valeur » à l’ élément cle1 du tableau « tableau ».

Il ne semble donc pas y avoir de différence entre un tableau indicé et un tableau associatif : les valeurs d’indice sont des entiers ou des clés nommées ; les indices non créés ou non affectés n’existent pas.

${a[*]} ou ${a}[@]
Liste tous les éléments du tableau ( Leur valeur )

  • Les éléments non affectés n’existent pas

${#a[*]} ou $${#a[@]}
Donne le nombre d’éléments.

${#a[1]}
donne la longueur de l’élément 1 ( le 2e).

Divers

- La fonction eval mérite un autre article !!

- {{ ${!var} }}  : permet différentes choses, par exemple :

echo ${!var*} affiche la liste des noms des variables qui commencent par var

mais

echo ${!var1} affiche la valeur de var1

voici les explication de man bash :

Si le premier caractère du paramètre est un point d’exclamation (!), un niveau d’imbrication de variable est introduit. Bash utilise la valeur de la variable formée par le reste du paramètre comme un nom de variable. Cette variable est alors développée et la valeur utilisée pour le reste de la substitution plutôt que la valeur du paramètre lui-même.
On appelle ce mécanisme le développement imbriqué.

Les exceptions à celui-ci sont les
développements de ${!préfixe*} et de ${!nom[@]}


   ${!préfixe*}
   ${!préfixe@}
Noms correspondant au préfixe. Se développe en noms des variables dont les noms commencent par préfixe, séparés par le premier caractère de la variable spéciale IFS. Si @ est utilisé et que le déveppement apparaît entre guillemets doubles, chaque nom de variable se développe séparément.


   ${!nom[@]}
   ${!nom[*]}
Liste des clefs du tableau. Si nom est une variable de type tableau, elle se développe en liste des indices (clefs) du tableau affecté à nom. Si nom n’est pas un tableau, se développe en 0 si nom existe et en vide sinon. Quand @ est utilisé et que le développement apparaît entre guillemets doubles, chaque clef se développe en un mot séparé.

Exemples

Afficher les noms de fichiers mp3 invalides, trouvés avec mp3val

Ces noms de fichiers sont extraits avec awk, qui laisse subsister guillemets " et : ainsi : "nom_de_fichier.mp3:"

La variable est traitée une 1re fois pour enlever la fin : ${i%\"*} (ôte le dernier guillemet et tout ce qui suit)

Puis une 2e fois pour enlever le 1er guillemet : ${a#*\"} (ôte tout jusqu’au 1er guillemet compris)

for i in $(mp3val * | egrep 'MPEG stream error' | awk '{print $2}' ); do a=$(echo ${i%\"*}) ; b=${a#*\"}; echo "$b" ; done | uniq

[1manipulation de variable , y compris sa lecture

[2un nombre quelconque de caractères

[31 caractère

[4un caractère de la classe

[5« - » remplace (provisoirement) la variable

[6« = » affecte la variable

[7die ?

[8i est un nombre entier ou une clé nommée


Accueil | Contact | Plan du site | | Statistiques du site | Visiteurs : 152 / 59180

Suivre la vie du site fr  Suivre la vie du site GNU, LINUX, BSD, LL  Suivre la vie du site AIDES GNU/LINUX  Suivre la vie du site BASH   ?

Site réalisé avec SPIP 3.1.6 + AHUNTSIC

Creative Commons License