Comment utiliser la commande Bash printf sous Linux

Publié: 2022-06-25
Un terminal Linux sur fond bleu.
fatmawati achmad zaenuri/Shutterstock.com

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

Ecrire sur un terminal

C'est l'une des parties les plus élémentaires 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 soutenue par Linux selon laquelle les programmes de ligne de commande sont aussi concis que possible, beaucoup n'écrivent sur le terminal que si quelque chose ne va pas. Dire à l'utilisateur ce qui se passe, est sur le point de se passer ou vient de se passer est une primitive de programmation essentielle.

Comment utiliser la commande Echo sous Linux
CONNEXION Comment utiliser la commande Echo sous Linux

Le shell Bash a la commande echo qui peut écrire du texte dans la fenêtre du terminal. Il peut gérer des variables et afficher leurs valeurs si elles sont incluses dans la chaîne, et vous pouvez l'utiliser dans des scripts ou sur la ligne de commande. Alors pourquoi printf existe-t-il même? L' echo n'a-t-il pas couvert l'écriture de texte? Eh bien, printf offre des fonctionnalités au-delà de l'acte simple d'écrire des chaînes dans les fenêtres du terminal. Il vous permet de formater la sortie avec une grande flexibilité, et il a aussi d'autres astuces.

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

Écrire des chaînes de base

Voyons comment echo et printf diffèrent lorsqu'ils écrivent des chaînes sur le terminal.

 echo voici quelques mots
 printf voici quelques mots 

Utiliser echo et printf avec des mots sans guillemets

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 collée contre l'invite de commande. Mais, tout d'abord, pour que printf agisse sur tous les mots, ils doivent être cités.

 echo voici quelques mots
 printf "voici quelques mots" 

Utiliser echo et printf avec des mots entre guillemets

C'est mieux. Nous avons tous les mots en cours d'impression mais nous n'obtenons toujours pas de nouvelle ligne. En effet, avec printf , vous n'obtenez une nouvelle ligne que si vous en demandez une. Cela peut sembler pénible, mais cela vous permet de décider d'en inclure un ou non. 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\n" 

Utiliser echo et printf avec des mots entre guillemets et le caractère de nouvelle ligne

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

 printf "Comment faire" && printf "Geek\n" 

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

Parce que le premier printf n'imprime pas une nouvelle ligne, la sortie du deuxième printf est positionnée immédiatement après "How-To" et sur la même ligne. Le deuxième printf utilise \n pour imprimer une nouvelle ligne. Cela fait apparaître l'invite de commande sur la ligne sous le texte imprimé.

CONNEXION: Comment traiter un fichier ligne par ligne dans un script Linux Bash

Autres caractères d'échappement

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

  • \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 barre oblique inverse.
  • \” : Imprime un caractère de citation.
  • \b : Affiche un caractère de retour arrière.

Le caractère d'échappement retour chariot ramène le curseur au début de la ligne courante .

 printf "Le miel est la racine de tous les maux\rL'argent\n" 

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

La commande printf traite son entrée de gauche à droite. La chaîne est imprimée sous forme de texte normal jusqu'à ce que printf rencontre le caractère d'échappement « \r ». Le curseur de sortie revient au début de la ligne courante.

Le traitement de la chaîne reprend avec la lettre immédiatement après le caractère « \r ». Le traitement du reste oblige printf à imprimer "Money", en écrasant le mot "Honey".

Le guillemet " " " est utilisé pour citer des chaînes et le caractère barre oblique inverse " \ " indique des séquences d'échappement. Si vous souhaitez imprimer ces caractères, vous devez les échapper avec une barre oblique inverse. Cela indique à printf de les traiter comme des caractères littéraux.

 printf "Ceci est un \tTab, ceci est un guillemet \", et ce \\ est une barre oblique inverse\n" 

Caractères d'échappement afin 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 d'accueil : $HOME\n" 

Utilisation de printf avec une variable d'environnement

CONNEXION: Comment travailler avec des variables dans Bash

Formater les chaînes

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 comme arguments pour que la chaîne de format fonctionne.

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, des entiers ou des caractères.

Ce sont 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.
  • %c : imprime un seul caractère.
  • %d : imprime un entier.
  • %f : imprime un nombre à virgule flottante.
  • %u : Affiche un entier non signé.
  • %o : Affiche une valeur en octal.
  • %x : imprime une valeur en hexadécimal, en minuscule.
  • %X : Imprime une valeur en hexadécimal, en majuscule.
  • %e : Affiche un nombre à virgule flottante en notation scientifique, en minuscules.
  • %E : Affiche un nombre à virgule flottante en notation scientifique, en majuscule.
  • %% : imprime un symbole de pourcentage "%".
 printf "Comment faire %s\n" "Geek"
 printf "%s%s %s\n" "Comment" "-À" "Geek" 

Affichage de printf acceptant "trop ​​​​d'arguments"

La chaîne de format dans la première commande inclut du texte qui lui est propre. Nous passons la chaîne "Geek" comme argument à printf . Il est mis en correspondance et imprimé par le spécificateur de format « %s ». Notez qu'il y a juste 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 , l'utilisation d'un espace est suffisante.

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

Pour imprimer différents types d'arguments, vous utilisez simplement le spécificateur de format approprié. Voici une routine de conversion rapide de nombres construite à l'aide de printf . Nous imprimerons la valeur 15 en notation décimale, octale et hexadécimale.

 printf "Déc : %d\nOct : %o\nHex : %x\n" 15 15 15 

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

Réduisons un peu cela 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 des valeurs hexadécimales en majuscules et avec des valeurs inférieures à 0x10 imprimées avec un zéro non significatif. Nous pouvons y parvenir en utilisant le spécificateur de format hexadécimal majuscule « %X » et en plaçant un spécificateur de largeur entre le signe de pourcentage « % » et le caractère « X ».

Cela indique à printf la largeur du champ dans lequel l'argument doit être imprimé. Le champ est rempli d'espaces. Avec ce format, les valeurs à deux chiffres seraient imprimées sans aucun remplissage.

 printf "Hex : %2X\n" 15 

impression d'une valeur hexadécimale en majuscule dans un champ de 2 caractères

Nous obtenons maintenant une valeur majuscule, imprimée avec un espace de tête. Nous pouvons faire en sorte que printf remplisse le champ avec des 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 majuscule 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 décimales à 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

Cela facilite la production de tableaux de résultats avec une sortie parfaitement alignée. Cette commande suivante démontre également une autre des bizarreries de Bash printf . S'il y a plus d'arguments qu'il n'y a 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é à la fois correspond au 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 "Flottant : %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. Cette commande imprime les chaînes dans un champ de 10 caractères.

 printf "%10s %d\n" "manteaux" 7 "chaussures" 22 "Parapluies" 3 

Utilisation du modificateur de largeur avec des chaînes

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

 printf "%-10s %d" "manteaux" 7 "chaussures" 22 "Parapluies" 3 

Utilisation d'un spécificateur de largeur justifié à gauche avec des chaînes

Le spécificateur de précision peut être utilisé pour définir le nombre maximal de caractères imprimés. Nous utilisons les caractères deux-points " : " pour montrer 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 spécificateur de largeur peut même être passé en argument . Utilisez un astérisque " * " au lieu d'un spécificateur numérique et transmettez la largeur comme argument entier.

 printf "%*s\n" 20 "Le plus à droite" 12 "Le milieu" 5 "Le plus à gauche" 

Passer le spécificateur de largeur comme argument à printf

Autres trucs et astuces

Les spécificateurs de format à l'intérieur de la chaîne de format fonctionneront avec des 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)) 

Imprimer 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

Cette commande printf imprime une chaîne 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 un spécificateur de format de chaîne « %s » est fourni avec une valeur numérique par erreur, il l'imprime comme s'il s'agissait d'une chaîne et ne se plaint pas. N'essayez pas cela avec le C printf - de très mauvaises choses se produiront. Votre programme va probablement planter. Mais le Bash printf 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

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

 printf "Entier : %d\n" 

Comment printf gère les arguments entiers manquants

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

 printf "Entier : %d\n" "Sept" 

Comment printf traite les chaînes fournies à la place des arguments entiers

Des symboles maladroits peuvent être générés en utilisant leur numéro Unicode ou « point de code ». Ceux-ci sont échappés à l'aide de la lettre "u" suivie de leur valeur Unicode.

 printf "Le symbole de l'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 chaîne

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

CONNEXION: Que sont les codages de caractères comme ANSI et Unicode, et en quoi diffèrent-ils?

Chevaux de course

Parfois, tout ce que vous avez à faire est de faire echo à du texte dans la fenêtre du terminal. Mais lorsque vous devez appliquer un positionnement et un formatage, printf est le bon outil pour le travail.

 printf "%b" "Ce-" "Ce-" "Ce-" "C'est tout le monde.\n"