9.7. Formatage de chaînes

Lorsque l’on souhaite afficher une chaîne de caractères sur la sortie standard, il est d’usage d’utiliser echo, commande interne historique des premiers shells. Pourtant, echo souffre de plusieurs handicaps :

- au cours du temps, différentes versions de cette commande interne ont vu le jour, ayant à la fois des syntaxes et des comportements différents

- le formatage des chaînes à afficher est malaisé.

L’intérêt de la commande interne printf est qu’elle ne présente pas ces inconvénients. Issue directement de la fonction printf de la bibliothèque standard du langage C, elle en partage les principales caractéristiques.

Sa syntaxe est la suivante : printf chaîne_format [ argument1 … ]

Comme sa consœur du langage C, chaîne_format est constituée de caractères littéraux et de spécificateurs de format. Les caractères littéraux seront affichés tels quels sur la sortie standard tandis que les spécificateurs, introduits à l’aide du caractère %, indiqueront à la fois le type et le formatage à utiliser pour afficher les arguments qui suivent chaîne_format. Pour provoquer un retour à la ligne, il faudra également utiliser la séquence d’échappement \n.

Pour que printf fonctionne correctement, il est fortement conseillé de fournir autant d’arguments qu’il y a de spécificateurs dans chaîne_format.

Dérivant de la fonction C printf, les possibilités syntaxiques offertes sont trop riches pour être complètement détaillées[3]. C’est pourquoi seuls quelques spécificateurs seront présentés.

Les types pris en compte sont les entiers (%d), les réels (%f), les chaînes (%s) et les caractères (%c).

$ printf "%d kilo(s) de %s (categorie %c) a %f euros l'unite\n"   2 fruits A 3,45 
2 kilo(s) de fruits (categorie A) a 3,450000 euros l'unite
$

Suivant la représentation souhaitée, il existe plusieurs spécificateurs pour un même type. Par exemple, pour le type des réels, on peut utiliser le spécificateur %f (notation usuelle) ou %e (notation scientifique). Le spécificateur %g évite l’affichage des 0 superflus.

$ printf "%f ou %e\n"  13,45  13,45
13,450000 ou 1,345000e+01
$
% printf "%g %g\n"  13,4500  3,450000e+01
13,45 34,5
$

Entre le caractère % et l’indicateur de conversion tel que d, f, etc. peuvent être mentionnés différents attributs qui affineront la représentation affichée. Par exemple,

%10d : affiche l’entier sur 10 caractères. Par défaut, la justification est à droite.

			$ printf "'%10d'\n" 123
			'       123'
			$

%-20s : justifie la chaîne à gauche sur 20 caractères.

			$ printf "'%20s'\n" coucou 
			'              coucou'
			$ printf "'%-20s'\n" coucou 
			'coucou              '
			$

La justification à gauche est également utilisable avec les autres types.

			$ printf "'%-10d'\n" 123 
			'123       '
			$

Si la longueur spécifiée est trop courte pour l’affichage, elle est ignorée. La valeur mentionnée correspond en fait à un nombre minimal de caractères à afficher.

			$ printf "'%2s'\n" coucou
			'coucou'
			$

Si à la place d’une longueur numérique on utilise le caractère *, c’est l’argument qui précède l’argument à afficher qui sera interprété comme la longueur d’affichage.

			$ read -p "longueur d'affichage : "  gabarit
			longueur d'affichage : 10
			$	
			$ printf "'%*d'\n"  ${gabarit}  123
			'       123'	=> affichage sur 10 caractères
			$ 
			$ read -p "longueur d'affichage : "  gabarit
			longueur d'affichage : 5
			$ 
			$ printf "'%-*s'\n"  ${gabarit}  cou
			'cou  '		=> affichage sur 5 caractères
			$

%.3f : un nombre situé après un caractère point indique la précision souhaitée. Pour un nombre réel, il s’agit du nombre de chiffres après la virgule à afficher.

			$ printf "%.3f\n" 12,34589
			12,346
			$
			$ printf "%.3f\n" 2,34
			2,340
			$

Si la précision est appliquée à une chaîne de caractères, elle sera interprétée comme un nombre maximal de caractères à afficher.

			$ printf "%.3s\n" coucou
			cou
			$

Certains caractères non imprimables (ex : le caractère interligne) disposent d’une séquence d’échappement (ex : \n) qui facilite leur utilisation. Quelques exemples de séquences d’échappement reconnues sont : \t (tabulation horizontale), \r (retour chariot), \a (bip).

$ printf "\tcoucou\n"
	coucou
$

Enfin, l’option –v de printf permet d’affecter à une variable, une chaîne formatée par cette commande interne. Dans ce cas, la chaîne résultat n’est pas affichée.

$ printf -v  util  "prenom:%-10s/taille:%.2f"  Pierre  1,8345
$ 
$ echo "$util"
prenom:Pierre    /taille:1,83
$


[3] L’exécution des commandes man 1 printf et man 3 printf permet de se faire une idée plus précise des possibilités offertes par la commande interne printf.