En règle générale, lors de l’écriture de scripts bash, nous utilisonsecho
pour imprimer sur la sortie standard. echo est une commande simple mais limitée dans ses capacités.
Pour avoir plus de contrôle sur la mise en forme de la sortie, utilisez leprintf
commander.
leprintf
formate et imprime ses arguments, comme le Cprintf()
une fonction.
printf
Commande n °
printf
est un shell intégré à Bash et à d’autres shells populaires comme Zsh et Ksh. Il existe également un/usr/bin/printf
binaire, mais la version intégrée du shell a priorité. Nous couvrirons la version intégrée de Bash deprintf
.
La syntaxe duprintf
est la suivante:
printf [-v var] format [arguments]
le-v
option indiqueprintf
non pas pour imprimer la sortie mais pour l’affecter à la variable.
leformat
est une chaîne qui peut contenir trois types d’objets différents:
- Caractères normaux qui sont simplement imprimés tels quels sur la sortie.
- Caractères à barre oblique inversée qui sont interprétés puis imprimés.
- Spécifications de conversion qui décrivent le format et sont remplacées par les valeurs des arguments respectifs qui suivent la chaîne de format.
La commande accepte n’importe quel nombre dearguments
. Si plusarguments
que les spécificateurs de format sont fournis, leformat
la chaîne est réutilisée pour consommer tous les arguments. Si moinsarguments
que les spécificateurs de format sont fournis, les spécificateurs de format numérique supplémentaires sont définis sur une valeur nulle tandis que les spécificateurs de format de chaîne sont définis sur une chaîne nulle.
Voici quelques points à considérer lors de la transmission des argumentsprintf
commander:
- Le shell remplacera toutes les variables, la correspondance générique et les caractères spéciaux avant de passer les arguments au
printf
commander. - Lors de l’utilisation de guillemets simples
''
la valeur littérale de chaque caractère entre guillemets sera conservée. Les variables et les commandes ne seront pas développées.
Un exemple typique d’utilisationprintf
ressemble à:
printf "Open issues: %s\nClosed issues: %s\n" "34" "65"
Open issues: 34
Closed issues: 65
La chaîneOpen issues: %s\nClosed issues: %s\n
est leformat
tandis que «34» et «65» sont des arguments. La chaîne de format contient deux caractères de nouvelle ligne (\n
) et deux spécificateurs de format (%s
) qui sont remplacés par les arguments.
leprintf
n’ajoute pas de caractère de nouvelle ligne (\n
) à la fin de la ligne.
Caractères avec barre oblique inverse #
Les caractères avec barre oblique inverse sont interprétés lorsqu’ils sont utilisés dans la chaîne de format ou dans un argument correspondant à un%b
spécificateur de conversion. Voici une liste des personnages d’échappement les plus courants:
\\
– Affiche un caractère barre oblique inverse.\b
– Affiche un caractère de retour arrière.\n
– Affiche une nouvelle ligne.\r
– Affiche un retour chariot.\t
– Affiche un onglet horizontal.\v
– Affiche un onglet vertical.
Spécifications de conversion #
Une spécification de conversion prend la forme suivante:
%[flags][width][.precision]specifier
Chaque spécification de conversion est marquée du signe de pourcentage (%
), inclut des modificateurs facultatifs et se termine par l’une des lettres suivantes qui représentent le type de données (specifier
) de l’argument correspondant:aAbcdeEfgGioqsuxX
.
Spécificateur de conversion de type #
La conversion de typespecifier
est un caractère qui spécifie comment interpréter l’argument correspondant. Ce caractère est obligatoire et il est placé après les champs facultatifs.
Vous trouverez ci-dessous une liste montrant toutes les conversions de types et ce qu’elles font:
%b
– Imprimer l’argument tout en développant les séquences d’échappement de barre oblique inverse.%q
– Affiche l’argument cité par le shell, réutilisable en entrée.%d
,%i
– Affiche l’argument sous la forme d’un entier décimal signé.%u
– Affiche l’argument sous la forme d’un entier décimal non signé.%o
– Affiche l’argument sous la forme d’un entier octal non signé.%x
,%X
– Affiche l’argument sous la forme d’un entier hexadécimal non signé.%x
imprime des lettres minuscules et%X
imprime en majuscules.%e
,%E
– Imprime l’argument sous forme de nombre à virgule flottante en notation exponentielle.%e
imprime des lettres minuscules et%E
imprime en majuscules.%a
,%A
– Imprime l’argument sous forme de nombre à virgule flottante en notation fractionnelle hexadécimale.%a
imprime des lettres minuscules et%A
imprime en majuscules.%g
,%G
– Imprimer l’argument sous forme de nombre à virgule flottante en notation normale ou exponentielle, selon ce qui est le plus approprié pour la valeur et la précision données.%g
imprime des lettres minuscules et%G
imprime en majuscules.%c
– Imprimez l’argument comme un seul caractère.%f
– Imprime l’argument sous forme de nombre à virgule flottante.%s
– Affiche l’argument sous forme de chaîne.%%
– Imprimer un littéral%
symbole.
Un nombre non signé représente zéro et des nombres positifs, tandis qu’un nombre signé représente des nombres négatifs, zéro et positifs.
La commande suivante imprime le nombre 100 dans trois systèmes numériques différents:
printf "Decimal: %d\nHex: %x\nOctal: %o\n" 100 100 100
Decimal: 100
Hex: 64
Octal: 144
Directive drapeaux #
Les indicateurs sont les premiers modificateurs facultatifs et sont utilisés pour définir la justification, les zéros de tête, les préfixes, etc.
Voici les plus courants:
-
– Alignez à gauche le texte imprimé dans le champ. Par défaut, le texte est aligné à droite.+
– Préfixez les nombres avec un+
ou-
panneaux. Par défaut, seuls les nombres négatifs sont préfixés par un signe négatif.0
– Remplit les nombres avec des zéros en tête plutôt que de l’espace.- Vide
– Préfixez les nombres positifs avec un espace vide et les nombres négatifs avec un moins (
-
). #
– Un format alternatif pour les nombres.
Directive largeur #
lewidth
La directive déposée est placée après tout caractère indicateur et spécifie le nombre minimum de caractères que la conversion doit entraîner.
Si la largeur du texte en sortie est inférieure à la largeur spécifiée, elle est remplie d’espaces. La largeur peut être spécifiée sous la forme d’un entier décimal non négatif ou d’un astérisque (*
).
Voici un exemple:
printf "%20s %d\n" Mark 305
%20s
signifie que le champ doit contenir au moins 20 caractères. Des blancs sont ajoutés avant le texte car, par défaut, la sortie est justifiée à droite. Pour aligner le texte à gauche, utilisez le-
drapeau (%-20s
).
Mark 305
Lorsqu’un astérisque (*
) est utilisé commewidth
, la largeur du champ de conversion est définie par un argument de largeur qui précède l’argument en cours de formatage.
Dans l’exemple ci-dessous, nous définissons la largeur à 10:
printf "%0*d" 10 5
0
est un drapeau qui remplit le nombre avec des zéros en tête au lieu de blancs. Le texte de sortie aura au moins 10 caractères:
0000000005
Directive de précision #
le.precision
Le modificateur consiste en un point (.
) suivi d’un entier positif ou d’un astérisque (*
) qui, selon le type de spécificateur, définit le nombre de caractères de chaîne ou de chiffres ou le nombre de décimales à imprimer.
La précision a l’effet suivant:
- Si le type de conversion est un entier, la précision spécifie le nombre minimum de chiffres à imprimer. Si le nombre de chiffres dans l’argument est inférieur à la précision, les zéros de tête sont imprimés.
- Si le type de conversion est une virgule flottante, la précision spécifie le nombre de chiffres qui suivent le caractère décimal. La précision par défaut est 6.
- Si le type de conversion est une chaîne, la précision spécifie le nombre maximal de caractères à imprimer. Si le nombre de caractères dans l’argument est supérieur à la précision, les caractères en excès sont tronqués.
Voici un exemple montrant comment arrondir un nombre à virgule flottante à 3 décimales:
printf "%.3f" 1.61803398
1.618
Lorsque la précision est définie sur un astérisque (*
), sa valeur est définie par l’argument de précision qui précède l’argument en cours de formatage.
printf "%.*f" 3 1.61803398
1.618
Conclusion #
leprintf