Comment utiliser les tests conditionnels à double crochet sous Linux
Agence web » Actualités du digital » Comment utiliser la commande Bash printf sous Linux

Comment utiliser la commande Bash printf sous Linux

La fête printf La commande 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 echo fournit la commande. Même printf Les caprices étranges de 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 maintenue 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 se passe tort. Dire à l’utilisateur ce qui se passe, ou est sur le point de se passer, ou vient de se passer est une primitive de programmation essentielle.

Le shell Bash a le echo commande 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 même ? N’est-ce pas echo avoir la chose d’écriture de texte couverte? 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 fête printf la commande est calquée sur la printf fonction du langage C, mais il y a 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 here are some words
printf here are some words

Utiliser echo et printf avec des mots sans guillemets

le echo commande imprime tous les mots sauf 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, avoir printf agir sur tous les mots, il faut les citer.

echo here are some words
printf "here are some words"

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. C’est parce qu’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. causer printf pour émettre une nouvelle ligne, vous devez inclure « n » dans votre chaîne. Il s’agit de la séquence d’échappement « newline ».

echo here are some words
printf "here are some wordsn"

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ù l’on printf instruction utilise une nouvelle ligne et l’autre pas.

printf "How-To " && printf "Geekn"

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 de la seconde printf est positionné immédiatement après « How-To » et sur la même ligne. La deuxième printf utilise-t-il n pour imprimer une nouvelle ligne. Cela fait apparaître l’invite de commande sur la ligne sous le texte imprimé.

EN RELATION: 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: Imprime un caractère de retour arrière.

Le caractère d’échappement retour chariot ramène le curseur au début du courant ligne.

printf "Honey is the root of all evilrMoneyn"

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

le printf La commande traite son entrée de gauche à droite. La chaîne est imprimée comme du texte normal jusqu’à ce que printf rencontre le « r » caractère d’échappement. 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 « r » personnage. Le traitement des causes restantes printf pour imprimer « Money », en écrasant le mot « Honey ».

Le guillemet « " » est utilisé pour citer des chaînes, et la 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 raconte printf pour les traiter comme des caractères littéraux.

printf "This is a tTab, this is a quotation mark ", and this  is a Backslashn"

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

Utilisation de variables

Utiliser des 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 "Home directory: $HOMEn"

Utilisation de printf avec une variable d'environnement

EN RELATION: 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 spécificateurs de format. Les spécificateurs de format indiquent printf quel 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 pour cent »% » signer. Pour imprimer un signe de pourcentage, vous utilisez deux signes de pourcentage ensemble « %%.”

  • %s: Imprime une chaîne.
  • %c: Imprime un seul caractère.
  • %ré: Imprime un entier.
  • %F: imprime un nombre à virgule flottante.
  • %u: imprime un entier non signé.
  • %o: Imprime 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 majuscules.
  • %%: Imprime un symbole de pourcentage « % ».
printf "How-To %sn" "Geek"
printf "%s%s %sn" "How" "-To" "Geek"

Affichage de printf acceptant "trop ​​​​d

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 assorti et imprimé par le « %s” spécificateur de format. 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 par chacun des « %s” spécificateurs de format à leur tour. Encore une fois, en C, vous devez mettre une virgule entre chaque argument mais le Bash printf oublions 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 printf. Nous imprimerons la valeur 15 en notation décimale, octale et hexadécimale.

printf "Dec: %dnOct: %onHex: %xn" 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: %xn" 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 mettant un spécificateur de largeur entre le signe de pourcentage « % » et le « X » personnage.

Cela raconte 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: %2Xn" 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 printf remplissez le champ avec des zéros au lieu d’espaces en mettant un zéro devant les deux :

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 définir 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 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, des arguments supplémentaires dans printf les appels de fonction sont ignorés.

printf "Float: %8.3fn" 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 %dn" "coats" 7 "shoes" 22 "Umbrellas" 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 derrière le pourcentage »% » signer.

printf "%-10s %d" "coats" 7 "shoes" 22 "Umbrellas" 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 afficher les limites du champ de largeur. Pas comment le mot « Parapluies » est tronqué.

printf ":%10.6s:n" "coats" "shoes" "Umbrellas"
printf ":%-10.6s:n" "coats" "shoes" "Umbrellas"

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 transmis en tant que argument. Utilisez un astérisque « *” au lieu d’un spécificateur numérique et transmettez la largeur comme argument entier.

printf "%*sn" 20 "Rightmost" 12 "Middle" 5 "leftmost"

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’un expression.

Ceci imprime la somme de deux nombres :

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

Imprimer la somme de deux nombres

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

printf "There are %d directoriesn" $(ls -d */ | wc -l)

Compter les répertoires avec printf

Ce printf commande imprime une chaîne renvoyée par un appel à une autre commande.

printf "Current user: %sn" $(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 "One: %s two: %sn" "Alpha"

Comment printf traite les arguments de chaîne manquants

Si un spécificateur de format de chaîne « %s” reçoit 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 arriveront. Votre programme va probablement planter. Mais le Bash printf le gère sans se plaindre.

printf "One: %s two: %sn" "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 "Integer: %dn"

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 "Integer: %dn" "Seven"

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 "The Euro symbol: u20ACn"

Impression d'une valeur Unicode échappée

Pour inclure des séquences d’échappement dans argument chaînes, vous devez utiliser le « %b” spécificateur de format dans la chaîne de format, pas le “%s” spécificateur de format de chaîne.

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 première printf L’instruction ne traite pas la valeur Unicode et ne reconnaît pas la séquence d’échappement de nouvelle ligne. La deuxième printf l’instruction utilise le « %b” spécificateur de format. Cela gère correctement le caractère Unicode et une nouvelle ligne est imprimée.

EN RELATION: 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 devez faire est echo du texte dans la fenêtre du terminal. Mais lorsque vous devez appliquer un positionnement et une mise en forme, printf est le bon outil pour le travail.

printf "%b" "Tha-" "tha-" "tha-" "that's all folks.n"

★★★★★