Maison Étudier Comment utiliser la commande Bash printf sous Linux

Comment utiliser la commande Bash printf sous Linux

par Frank
Publié : Dernière mise à jour le

Introduction

La commande Bash printf vous offre plus de flexibilité et de choix de formatage que la commande echo lors de l'écriture dans une fenêtre de terminal Linux. Même les particularités de printf peuvent être bénéfiques.

C'est l'un des aspects les plus fondamentaux du travail avec les logiciels. Vous lisez ce que l'application a écrit à l'écran. Même avec l'habitude dérivée d'Unix et prise en charge par Linux des programmes de ligne de commande aussi brefs que possible, de nombreuses applications n'écrivent sur le terminal que lorsque quelque chose ne va pas. Une base de programmation cruciale est d'informer l'utilisateur de ce qui se passe, va se passer ou s'est récemment produit.

La commande echo dans le shell Bash peut écrire du texte sur l'affichage du terminal. Vous pouvez l'utiliser dans des scripts ou sur la ligne de commande, et il peut gérer des variables et afficher leurs valeurs si elles sont contenues dans la chaîne. Alors, quel est l'intérêt de printf ? L'écriture de texte n'est-elle pas quelque chose dont l'écho s'occupe ? Printf, d'autre part, offre plus que la simple possibilité d'écrire des chaînes dans les fenêtres de terminal. Il vous donne beaucoup de polyvalence en ce qui concerne le formatage de la sortie, et il a quelques astuces supplémentaires dans sa manche.

La commande printf dans Bash est similaire à la fonction printf en C, mais il y a plusieurs changements. Vous devrez être au courant des changements si vous êtes familier avec C.

Création de chaînes simples

Examinons les différences entre echo et printf lorsqu'il s'agit d'écrire des chaînes sur le terminal.

echo voici quelques mots
printf voici quelques mots

Utiliser echo et printf avec des mots sans guillemets

Alors que echo imprime tous les mots, printf publie simplement le premier. De plus, printf n'imprime pas de nouvelle ligne. La sortie est en plein milieu de l'invite de commande. Mais d'abord et avant tout, tous les mots doivent être cités pour que printf agisse en conséquence.

echo voici quelques mots
printf "voici quelques mots"

Utiliser echo et printf avec des mots entre guillemets

C'est un pas en avant. Nous avons imprimé tous les mots, mais nous attendons toujours une nouvelle ligne. C'est parce que printf n'imprime une nouvelle ligne que si vous en demandez spécifiquement une. Cela peut sembler gênant, mais cela vous permet de choisir d'en ajouter ou non. Vous devez ajouter "n" dans votre chaîne pour que printf émette une nouvelle ligne. La séquence d'échappement "newline" est utilisée ici.

echo voici quelques mots
printf "voici quelques mots"

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

Vous utiliserez parfois une nouvelle ligne et pas d'autres. Dans cet exemple, une commande printf utilise une nouvelle ligne tandis que l'autre ne le fait pas.

printf "Comment faire" && printf "Geek"

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

Étant donné que le premier printf n'imprime pas de nouvelle ligne, la sortie du deuxième printf est placée sur la même ligne que "How-To". Pour imprimer une nouvelle ligne, le deuxième printf utilise n. L'invite de commande s'affichera maintenant sur la ligne sous le texte imprimé.

Personnages qui ont échappé à la capture

Voici quelques caractères supplémentaires qui peuvent être utilisés comme échappements. Vous avez déjà vu comment "n" fonctionne.

n : Passe à une nouvelle ligne.
r : cette commande imprime un retour chariot. Le curseur de sortie revient au début de la ligne courante.
t : cette commande imprime un caractère de tabulation.
v : ajoute un espace de tabulation vertical à la page.
\ : Un caractère barre oblique inverse est imprimé.
“ : Affiche un guillemet.
b : affiche le caractère de retour arrière.

Le caractère d'échappement retour chariot est utilisé pour ramener le curseur au début de la ligne courante.

printf "Le miel est la racine de tout malrMoneyn"

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

La commande printf se lit de gauche à droite. Jusqu'à ce que printf détecte le caractère d'échappement "r", la chaîne est écrite comme du texte normal. Le curseur de sortie est repositionné au début de la ligne courante.

Avec la lettre immédiatement sous le caractère "r", le traitement de la chaîne continue. Le reste force printf à imprimer "Money", qui remplace l'expression "Honey".

Le caractère barre oblique inverse "" signale des séquences d'échappement, tandis que le guillemet """ est utilisé pour citer des chaînes. Si vous souhaitez imprimer ces caractères, utilisez une barre oblique inverse pour les échapper. Cela indique à printf qu'ils doivent être traités comme des caractères littéraux.

printf "Ceci est un tTab, ceci est un guillemet ", et ceci \ est un Backslashn"

Caractères d'échappement afin qu'ils soient traités littéralement

Variables en action

L'utilisation de variables avec printf est assez similaire à l'utilisation de variables avec echo. Pour inclure une variable, telle que cette variable d'environnement, utilisez le signe dollar "$" comme d'habitude avant.

printf "Répertoire d'accueil : $HOMEn"

Utilisation de printf avec une variable d'environnement

Formatage de chaîne

Les chaînes de format sont des chaînes qui spécifient le format de sortie. Vous fournissez le texte de la chaîne de format et des valeurs supplémentaires à utiliser comme arguments.

Le texte, les séquences d'échappement et les spécificateurs de format peuvent tous être inclus dans la chaîne de format.

Les spécificateurs de format de Printf l'informent du type d'argument qu'il doit accepter, comme des chaînes, des nombres ou des caractères.

Les spécificateurs de format les plus fréquents sont indiqués ci-dessous. Un symbole de pourcentage "pourcentage" les précède tous. Vous pouvez imprimer un signe de pourcentage en combinant deux signes de pourcentage « pourcentage pour cent ».

  • %s: Imprime une chaîne.
  • %c: Imprime un seul caractère.
  • %d: Imprime un entier.
  • %f: imprime un nombre à virgule flottante.
  • %u: imprime un entier non signé.
  • %o: Imprime une valeur en octal.
  • %x: Prints a value in 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 majuscules.
  • %%: Prints a percent “%” symbol.
printf "Comment faire %sn" "Geek"
printf "%s%s %sn" "Comment" "-À" "Geek"

Affichage de printf acceptant "trop d'arguments"

La chaîne de format de la première commande contient son propre contenu. La chaîne "Geek" est envoyée à printf comme argument. Le spécificateur de format « %s » y correspond et l'imprime. Entre la chaîne de format et la chaîne d'argument, il y a juste un espace. En C, une virgule serait nécessaire pour les séparer, mais avec la version Bash de printf, un espace suffit.

Seuls les spécificateurs de format et la séquence d'échappement de nouvelle ligne sont inclus dans la deuxième chaîne de format. Chacun des spécificateurs de format « %s » consomme les trois paramètres de chaîne à tour de rôle. Encore une fois, en C, une virgule est requise entre chaque paramètre, mais la fonction printf de Bash nous permet d'ignorer cette exigence.

Utilisez simplement le spécificateur de format approprié pour générer différents types d'arguments. Voici une simple fonction de conversion de nombre basée sur printf. En notation décimale, octale et hexadécimale, nous imprimerons le nombre 15.

printf "Déc : %dnOct : %onHex : %xn" 15 15 15

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

Réduisons-le un peu pour rendre l'exemple moins encombré.

printf "Hex : %xn" 15

Impression d'une valeur hexadécimale

La majorité d'entre nous sommes habitués à voir des nombres hexadécimaux rendus en majuscules et avec des valeurs inférieures à 0x10 précédées d'un zéro non significatif. Nous pouvons le faire en plaçant un spécificateur de largeur entre le signe de pourcentage « % » et le caractère « X » et en utilisant le spécificateur de format hexadécimal majuscule « % X ».

Cela spécifie la taille du champ dans lequel l'argument doit être imprimé à printf. Des espaces ont été ajoutés au champ. Les nombres à deux chiffres seraient présentés sans aucun rembourrage dans ce style.

printf "Hex : %2Xn" 15

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

Nous avons maintenant une valeur majuscule avec un espace de tête écrit dessus. En plaçant un zéro devant les deux, nous pouvons demander à printf de remplir le champ avec des zéros au lieu d'espaces :

printf "Hex: %02Xn" 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 spécifier le nombre de décimales à inclure dans la sortie.

printf "Floating point: %08.3fn" 9.243546

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

Cela facilite la création de tableaux de résultats avec une sortie parfaitement alignée. Cette commande affiche é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 qu'ils soient tous utilisés. Le nombre de spécificateurs de format dans la chaîne de format détermine la taille du lot qui est traité à un moment donné. Les arguments supplémentaires envoyés à la fonction printf en C sont ignorés.

printf "Flottant : %8.3fn" 9.243546 23.665 8.0021

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

Les chaînes peuvent également utiliser les spécificateurs de largeur et de précision. Les chaînes sont imprimées dans un champ large de 10 caractères à l'aide de cette commande.

printf "%10s %dn" "coats" 7 "shoes" 22 "Umbrellas" 3

Utilisation du modificateur de largeur avec des chaînes

By default, values are right-justified in their fields. To left-justify them, use a minus sign “-” immediately behind the percent “%” sign.

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 vous permet de choisir le nombre maximum de caractères qui seront imprimés. Les lettres ":" sont utilisées pour indiquer les limites du champ de largeur. Pas dans la façon dont le terme « parapluies » est raccourci.

printf ":%10.6s:n" "coats" "shoes" "Umbrellas"
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

Même comme argument, le spécificateur de largeur peut être utilisé. Au lieu d'un spécificateur numérique, utilisez un astérisque "*" et fournissez la largeur sous forme d'entrée entière.

printf "%*sn" 20 "Le plus à droite" 12 "Le milieu" 5 "Le plus à gauche"

Passer le spécificateur de largeur comme argument à printf

Autres bizarreries et gadgets

Les spécificateurs de format dans la chaîne de format fonctionneront avec des valeurs du type approprié, qu'elles soient fournies en tant qu'arguments ordinaires sur la ligne de commande ou créées à la suite d'une expression.

Ceci affiche le résultat de l'addition de deux nombres :

printf "23+32=%dn" $((23+32))

Imprimer la somme de deux nombres

Le nombre de dossiers dans le répertoire de travail courant est imprimé par cette commande :

printf "Il y a %d répertoiresn" $(ls -d */ | wc -l)

Compter les répertoires avec printf

La commande printf imprime une chaîne renvoyée par un autre programme.

printf "Utilisateur actuel : %sn" $(whoami)

Impression de la sortie d'une autre commande

Si le spécificateur de format de chaîne "percent s" n'est pas donné avec un argument, printf renvoie null.

printf "Un : %s deux : %sn" "Alpha"

Comment printf traite les arguments de chaîne manquants

Si une valeur numérique est donnée par accident pour le spécificateur de format de chaîne " % s ", il l'imprime sous forme de chaîne et ne se plaint pas. Si vous faites cela en utilisant le C printf, vous vous retrouverez avec beaucoup de problèmes. Votre logiciel va presque certainement planter. Le Bash printf, d'autre part, ne semble pas s'en soucier.

printf "Un : %s deux : %sn" "Alpha" 777

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

Si le spécificateur de format entier "% d" ne reçoit pas d'argument, zéro est imprimé.

printf "Entier : %dn"

Comment printf gère les arguments entiers manquants

Bash affichera un message d'erreur et printf imprimera zéro si le spécificateur de format entier " % d " reçoit une entrée de chaîne par accident.

printf "Entier : %dn" "Sept"

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

Des symboles maladroits peuvent être créés en saisissant leur numéro Unicode, également appelé « point de code ». La lettre « u » est utilisée pour échapper certains caractères, suivie de leur valeur Unicode.

printf "Le symbole de l'euro : u20ACn"

Impression d'une valeur Unicode échappée

Pour prendre en charge les séquences d'échappement dans les chaînes d'arguments, utilisez le spécificateur de format « % b » au lieu du spécificateur de format de chaîne « % s » dans la chaîne de format.

printf "%s" "u20ACn"
printf "%b" "u20ACn"

Utilisation du spécificateur de format %b pour gérer les séquences d'échappement dans les arguments de chaîne

La commande printf initiale ne reconnaît pas la séquence d'échappement de saut de ligne et ne traite pas la valeur Unicode. Le spécificateur de format « % b » est utilisé dans la deuxième commande printf. Le caractère Unicode est traité de manière appropriée et une nouvelle ligne s'affiche.

Chevaux de course

Vous devrez peut-être juste faire écho du texte dans la fenêtre du terminal à l'occasion. Cependant, printf est l'outil idéal pour la tâche lorsque vous devez appliquer un positionnement et un formatage.

printf "%b" "Tha-" "tha-" "tha-" "c'est tout le monde.n"

Tu pourrais aussi aimer

Your How-to Guides for Everything and Beyond.

S'abonner

La meilleure newsletter pratique n'importe où

©2022 Navhow, Tous droits réservés