La commande printf de Bash vous permet d’écrire dans une fenêtre de terminal Linux avec un contrôle plus fin et davantage d’options de formatage que la commande echo. Même les bizarreries de printf peuvent être utiles.

Écriture dans un terminal

C’est l’une des parties les plus fondamentales de l’interaction avec un programme. Le programme écrit quelque chose à l’écran, et vous le lisez. Même en tenant compte de la convention dérivée d’Unix et maintenue par Linux selon laquelle les programmes de ligne de commande doivent être aussi laconiques que possible, beaucoup n’écrivent dans le terminal que si quelque chose ne va pas.

Dire à l’utilisateur ce qui se passe, ce qui va se passer ou ce qui vient de se passer est une primitive essentielle de la programmation.

Comment utiliser la commande Echo sous Linux

Le shell Bash dispose de la commande echo qui permet d’écrire du texte dans la fenêtre du terminal. Elle peut gérer les variables et afficher leurs valeurs si elles sont incluses dans la chaîne de caractères, et vous pouvez l’utiliser dans des scripts ou sur la ligne de commande. Alors pourquoi printf existe-t-il ? L’écriture de texte n’est-elle pas couverte par echo ?

Et bien, printf offre des fonctionnalités qui vont au-delà de la simple écriture de chaînes de caractères dans les fenêtres du terminal. Elle vous permet de formater la sortie avec une grande flexibilité, et elle a aussi d’autres astuces.

La commande printf de Bash est calquée sur la fonction printf du langage C, mais il existe des différences. Si vous connaissez le C, vous devrez faire attention à ces différences.

Pour aller plus loin : 5 systèmes d’exploitation Linux pour smartphones à installer sur votre appareil

Écriture de chaînes de caractères de base

Voyons comment echo et printf diffèrent lorsqu’ils écrivent des chaînes de caractères dans le terminal.

echo voici quelques mots

printf voici quelques mots

Utilisation de echo et de printf avec des mots non cités

La commande echo imprime tous les mots, mais printf n’imprime que le premier mot. De plus, il n’y a pas de nouvelle ligne imprimée par printf. La sortie est placée juste à côté de l’invite de commande. Mais, tout d’abord, pour que printf agisse sur tous les mots, ceux-ci doivent être cités.

echo voici quelques mots

printf « voici quelques mots ».

Utiliser echo et printf avec des mots cités

C’est mieux. Nous avons imprimé tous les mots mais nous n’avons toujours pas de nouvelle ligne. C’est parce qu’avec printf vous n’obtenez une nouvelle ligne que si vous la demandez. Cela peut sembler pénible mais cela vous permet de décider d’en inclure une ou pas. Pour que printf émette une nouvelle ligne, vous devez inclure « \n » dans votre chaîne. Il s’agit de la séquence d’échappement « newline ».

echo voici quelques mots

printf « voici quelques mots ».

Utilisation de echo et printf avec des mots cités et le caractère de retour à la ligne

Parfois, vous utiliserez un saut de ligne, parfois non. Voici un cas où une instruction printf utilise une nouvelle ligne et pas l’autre.

printf « Journal  » && printf « Freenaute\n »

Utilisation de deux printf pour créer une seule ligne de texte

Étant donné que la première instruction printf n’imprime pas de nouvelle ligne, la sortie de la deuxième instruction printf est placée immédiatement après « Journal-du » et sur la même ligne. Le deuxième printf utilise \n pour imprimer une nouvelle ligne. Ainsi, l’invite de commande apparaît sur la ligne située sous le texte imprimé.

À lire également : 11 Distros Linux qui supportent toujours l’architecture 32 bits

Autres caractères d’échappement

Voici d’autres caractères d’échappement que vous pouvez utiliser. Vous avez déjà vu « \n » en action.

La meilleure lettre d’information technique du monde

Rejoignez les 425 000 abonnés et recevez un condensé quotidien de fonctionnalités, d’articles, d’actualités et de faits divers.

En envoyant votre email, vous acceptez les conditions d’utilisation et la politique de confidentialité.

\n : Descend à une nouvelle ligne.
\r : Imprime un retour chariot. Cela renvoie le curseur de sortie au début de la ligne actuelle.
\t : Imprime un caractère de tabulation.
\v : Imprime un espace de tabulation vertical.
\\ : Imprime un caractère de barre oblique inversée.
\" : Imprime un caractère de citation.
\b : Imprime un caractère de retour arrière.

Le caractère d’échappement retour chariot ramène le curseur au début de la ligne en cours.

printf « Le miel est la racine de tous les maux\rMoney\n »

Utilisation du caractère retour chariot pour revenir en début de ligne

La commande printf traite son entrée de gauche à droite. La chaîne est imprimée comme du texte normal jusqu’à ce que printf rencontre le caractère d’échappement « \r ». Le curseur de sortie est déplacé vers le début de la ligne en cours.

Le traitement de la chaîne de caractères reprend avec la lettre qui suit immédiatement le caractère « \r ». En traitant le reste de la chaîne, printf imprime « Money », écrasant le mot « Honey ».

Le guillemet «  » » est utilisé pour citer des chaînes de caractères, et la barre oblique inversée « \ » désigne les séquences d’échappement. Si vous voulez imprimer ces caractères, vous devez les échapper avec une barre oblique inverse. Ceci indique à printf de les traiter comme des caractères littéraux.

printf « Ceci est une \tTab, ceci est un guillemet \ », et ceci \ » est une barre oblique inversée \ ».

Échapper aux caractères pour qu’ils soient traités littéralement

Utilisation de variables

L’utilisation de variables avec printf est très similaire à leur utilisation avec echo . Pour inclure une variable, comme cette variable d’environnement, faites-la précéder du signe dollar « $ » comme d’habitude.

printf « Répertoire personnel : $HOME\n ».

Utilisation de printf avec une variable d’environnement

Chaînes de format

Les chaînes de format sont des chaînes qui définissent le format de la sortie. Vous fournissez du texte et d’autres valeurs en tant qu’arguments pour que la chaîne de format opère.

La chaîne de format peut inclure du texte, des séquences d’échappement et des spécificateurs de format. Les spécificateurs de format indiquent à printf le type d’argument à attendre, comme des chaînes de caractères, des entiers ou des caractères.

Voici les spécificateurs de format les plus courants. Ils sont tous précédés d’un signe de pourcentage « % ». Pour imprimer un signe de pourcentage, vous utilisez deux signes de pourcentage ensemble « %% ».

%s : Imprime une chaîne de caractères.
%c : Imprime un seul caractère.
%d : Imprime un nombre entier.
%f : imprime un nombre à virgule flottante.
%u : Imprime un nombre entier non signé.
%o : Imprime une valeur en octal.
%x : Imprime une valeur en hexadécimal, en minuscules.
%X : Imprime une valeur en hexadécimal, en majuscules.
%e : Imprime un nombre à virgule flottante en notation scientifique, en minuscules.
%E : Imprime un nombre à virgule flottante en notation scientifique, en majuscules.
%% : Imprime un symbole de pourcentage "%".

printf « Journal-du %s\n » « Freenaute » (Comment faire)

printf « %s%s %s\n » « Journal » « -du » « Freenaute »

Pour aller plus loin : 14 distributions Linux légères pour donner une nouvelle vie à votre vieux PC

Affichage de printf acceptant « trop » d’arguments

La chaîne de format de la première commande comprend un texte qui lui est propre. Nous passons la chaîne « Freenaute » comme argument à printf. Elle correspond à, et est imprimée par, le spécificateur de format « %s ». Notez qu’il n’y a qu’un espace entre la chaîne de format et la chaîne d’argument. En C, vous auriez besoin d’une virgule pour les séparer mais avec la version Bash de printf, un espace est suffisant.

La deuxième chaîne de format ne contient que les spécificateurs de format et la séquence d’échappement newline. Les trois arguments de la chaîne sont consommés par chacun des spécificateurs de format « %s » à tour de rôle. Encore une fois, en C, vous devez mettre une virgule entre chaque argument, mais le printf de Bash nous permet de l’oublier.

Pour imprimer différents types d’arguments, il suffit d’utiliser le spécificateur de format approprié. Voici une routine rapide de conversion de nombres construite à l’aide de printf. Nous allons imprimer la valeur 15 en notation décimale, octale et hexadécimale.

printf « Dec : %d\nOct : %o\nHex : %x\n » 15 15 15 15

utilisation de printf pour imprimer des valeurs numériques dans différentes notations de base

Réduisons un peu le nombre de caractères pour que l’exemple soit moins encombré.

printf « Hex : %x\n » 15

Impression d’une valeur hexadécimale

La plupart d’entre nous sont habitués à voir les valeurs hexadécimales en majuscules et les valeurs inférieures à 0x10 imprimées avec un zéro en tête. Nous pouvons obtenir cela en utilisant le spécificateur de format hexadécimal en majuscules « %X » et en plaçant un spécificateur de largeur entre le signe pourcent « % » et le caractère « X ».

Cela indique à printf la largeur du champ dans lequel l’argument doit être imprimé. Le champ est complété par des espaces. Avec ce format, les valeurs à deux chiffres seront imprimées sans aucun remplissage.

printf « Hex : %2X\n » 15

impression d’une valeur hexadécimale en majuscules dans un champ de 2 caractères de largeur

Nous obtenons maintenant une valeur en majuscules, imprimée avec un espace en tête. Nous pouvons faire en sorte que printf remplisse le champ de zéros au lieu d’espaces en mettant un zéro devant les deux :

printf « Hex : %02X\n » 15

Impression d’une valeur hexadécimale en majuscules dans un champ de 2 caractères rempli de zéros.

Le spécificateur de précision vous permet de définir le nombre de points décimaux à inclure dans la sortie.

printf « Point flottant : %08.3f\n » 9.243546

Utilisation des modificateurs de largeur et de précision avec un nombre à virgule flottante

Il est ainsi facile de produire des tableaux de résultats avec une sortie bien alignée. La commande suivante démontre également une autre particularité de Bash printf. S’il y a plus d’arguments que de spécificateurs de format, les arguments sont introduits dans la chaîne de format par lots jusqu’à ce que tous les arguments aient été utilisés.

La taille du lot traité à un moment donné est le nombre de spécificateurs de format dans la chaîne de format. En C, les arguments supplémentaires dans les appels de fonction printf sont ignorés.

printf « Float : %8.3f\n » 9.243546 23.665 8.0021

Utilisation des modificateurs de largeur et de précision pour créer un tableau soigné

Vous pouvez également utiliser les spécificateurs de largeur et de précision avec des chaînes de caractères. Cette commande imprime les chaînes de caractères dans un champ de 10 caractères de large.

printf « %10s %d\n » « manteaux » 7 « chaussures » 22 « parapluies » 3

Utilisation du modificateur de largeur avec les chaînes de caractères

Par défaut, les valeurs sont justifiées à droite dans leurs champs. Pour les ajuster à gauche, utilisez le signe moins « – » immédiatement après le signe pourcentage « % ».

printf « %-10s %d » « manteaux » 7 « chaussures » 22 « parapluies » 3

Utilisation d’un spécificateur de largeur justifié à gauche avec des chaînes de caractères

Le spécificateur de précision peut être utilisé pour définir le nombre maximum de caractères qui sont imprimés. Nous utilisons les caractères deux-points  » : » pour indiquer les limites du champ de largeur. Pas comment le mot « Parapluies » est tronqué.

printf « :%10.6s:\n » « manteaux » « chaussures » « Parapluies »

printf « :%-10.6s:\n » « manteaux » « chaussures » « Parapluies »

Utilisation du modificateur de précision pour limiter le nombre de caractères imprimés à partir d’une chaîne.

Le modificateur de largeur peut même être transmis en tant qu’argument. Utilisez un astérisque « * » au lieu d’un spécificateur numérique, et passez la largeur comme un argument entier.

Passer le spécificateur de largeur comme argument à printf

Autres astuces et bizarreries

Les spécificateurs de format à l’intérieur de la chaîne de format fonctionneront avec les valeurs du type approprié, qu’elles soient fournies sur la ligne de commande en tant qu’arguments réguliers ou qu’elles soient générées en tant que sortie d’une expression.

Ceci imprime la somme de deux nombres :

printf « 23+32=%d\n » $((23+32))

Impression de la somme de deux nombres

Cette commande imprime le nombre de répertoires dans le répertoire de travail actuel :

printf « Il y a %d répertoires\n » $(ls -d */ | wc -l)

Compter les répertoires avec printf

La commande printf imprime une chaîne de caractères renvoyée par un appel à une autre commande.

printf « Utilisateur actuel : %s\n » $(whoami)

Impression de la sortie d’une autre commande

Si un spécificateur de format de chaîne « %s » n’est pas fourni avec un argument, printf n’imprime rien.

printf « Un : %s deux : %s\n » « Alpha ».

Comment printf traite les arguments de chaîne manquants

Si le spécificateur de format de chaîne « %s » est fourni par erreur avec une valeur numérique, il l’imprime comme s’il s’agissait d’une chaîne et ne se plaint pas. N’essayez pas ceci avec le printf du C – de très mauvaises choses se produiront. Votre programme se plantera probablement. Mais le printf de Bash le gère sans se plaindre.

printf « Un : %s deux : %s\n » « Alpha » 777

Comment printf accepte silencieusement les entiers comme valeurs de chaîne de caractères

Si le spécificateur de format entier « %d » ne reçoit aucun argument, il affiche zéro.

printf « Entier : %d\n »

Comment printf gère les arguments entiers manquants

Si un spécificateur de format entier « %d » reçoit par erreur un argument de type chaîne, Bash affiche un message d’erreur et printf affiche zéro.

printf « Entier : %d\n » « Seven »

Comment printf traite les chaînes de caractères qui sont fournies à la place des arguments entiers

Les symboles gênants peuvent être générés en utilisant leur numéro Unicode ou « point de code ». Ils sont échappés à l’aide de la lettre « u » suivie de leur valeur Unicode.

printf « Le symbole Euro : \u20AC\n »

Impression d’une valeur Unicode échappée

Pour inclure des séquences d’échappement dans les chaînes d’arguments, vous devez utiliser le spécificateur de format « %b » dans la chaîne de format, et non le spécificateur de format de chaîne « %s ».

printf « %s » « \u20AC\n »

printf « %b » « \u20AC\n »

Utilisation du spécificateur de format  » %b  » pour gérer les séquences d’échappement dans les arguments de type chaîne de caractères

La première instruction printf ne traite pas la valeur Unicode et ne reconnaît pas la séquence d’échappement newline. La deuxième instruction printf utilise le spécificateur de format « %b ». Il traite correctement le caractère Unicode et une nouvelle ligne est imprimée.

Des chevaux pour les cours

Parfois, tout ce dont vous avez besoin est d’envoyer un texte dans la fenêtre du terminal. Mais lorsque vous devez appliquer un certain positionnement et un certain formatage, printf est l’outil idéal pour ce travail.

printf « %b » « Tha- » « tha- » « tha- » « C’est tout, les amis. »