Dans cet article, je vais expliquer l'utilisation de base du Bash printf commande avec des exemples sous Linux. À la fin de cet article, vous serez à l'aise avec l'utilisation de la commande printf dans les scripts shell Bash.
Commande bash printf
Frapper propose deux types de commandes pouvant être utilisées pour imprimer votre sortie sur le terminal. L'un est l'écho commande qui est principalement utilisée à cette fin. Le second est le printf commande.
Printf
est similaire à la fonction printf en C langage mais avec son propre ensemble de fonctionnalités. La principale différence entre echo
et printf
commande est que printf
propose un formatage et des fonctionnalités supplémentaires par rapport à echo
commande.
Si vous n'avez pas utilisé le echo
commande avant, nous avons un article détaillé à ce sujet que vous devriez consulter.
- La commande Bash Echo expliquée avec des exemples sous Linux
Printf
est un shell intégré, mais vous pouvez également trouver une commande externe pour printf
. Builtin a priorité sur la commande externe. Vous pouvez obtenir ces informations en exécutant le type
commande comme indiqué ci-dessous.
$ type -a printf printf is a shell builtin printf is /usr/bin/printf printf is /bin/printf
Pour plus de détails sur le type
commande, reportez-vous au guide suivant :
- Le didacticiel de commande de type avec des exemples pour les débutants
Si vous souhaitez exécuter la version externe de printf
, vous devez pointer vers le chemin complet du répertoire où réside le binaire.
$ printf "Hello World\n" # SHELL BUILTIN
$ /usr/bin/printf "Hello World\n" # EXTERNAL VERSION OF PRINTF

Afficher l'aide de Bash printf
Comme je l'ai mentionné dans la section précédente, printf
est bash intégré. Vous devez ouvrir le bash
man page et accédez au printf
rubrique.
$ man bash
/printf → presss

Vous pouvez également exécuter la commande suivante qui affichera la section d'aide de printf
depuis le bash
page de manuel.
$ man bash | less --pattern='^ *printf +['
Forme de base de la commande printf
Tout au long des exemples, je comparerai le printf
avec echo
commande pour comprendre les points communs.
Ci-dessous le format pour le printf
commande :
printf [-v var] format [arguments]
Les arguments doivent être passés à printf
sinon, il échouera comme indiqué dans l'image ci-dessous.
$ printf
$ echo $?

Passez un argument et exécutez le printf
commander à nouveau. Dans l'exemple ci-dessous, vous pouvez voir que j'ai ajouté \n qui est le caractère de nouvelle ligne. Par défaut, printf
n'ajoutera pas une nouvelle ligne comme le echo
commande, vous devez donc ajouter \n
.
$ printf "Linux is fun to work with" # WITHOUT NEW LINE
$ printf "Linux is fun to work with\n" # WITH NEW LINE

Variables et interprétation des commandes
Vous pouvez inclure toutes les variables ou exécuter des commandes dans le printf
déclaration. Ce comportement est similaire au echo
commande.
$ VAR1="Linux"
$ printf "$VAR1 is fun to work with\n"

Suggestion de lecture :
- Scripts bash – Variables expliquées à l'aide d'exemples
Comportement des guillemets simples ou doubles
Lorsque vous entourez vos arguments de guillemets simples, la variable et la commande seront traitées comme du texte brut. C'est le même comportement dans echo
commande aussi. Vous devez entourer les arguments de guillemets doubles si vous souhaitez que la variable et la commande soient développées.
$ printf '$VAR1 is fun to work with\n'
$ printf 'Today date = $(date)\n'

Lorsque vous passez des arguments sans guillemets, printf
ne considérera que le premier mot comme argument et l'affichera. Donc, en utilisant des guillemets autour de printf
est nécessaire.
$ printf Today date = $(date)\n

Redirection et canalisation de la sortie
Par défaut, printf
enverra les sorties à stdout (terminal). Vous pouvez rediriger la sortie vers un fichier à l'aide de l'opérateur de redirection ou combinez-le avec l'opérateur de canalisation pour un traitement ultérieur.
# PRINT TO STDOUT $ printf "Today date = $(date)\n"
# REDIRECT TO A FILE $ printf "Today date = $(date)\n" > /tmp/tdy.txt $ cat /tmp/tdy.txt
# PIPE $ printf "Today date = $(date)\n" | grep -i -o IST

Lire connexe :
- La redirection bash expliquée avec des exemples
Affecter une sortie à une variable
Parfois, vous souhaiterez peut-être stocker le printf
sortie vers une variable et l'utiliser plus tard pour certains traitements. Normalement, vous exécuterez le printf
entouré de crochets qui exécutera la commande et affectera la sortie à une variable.
$ ZONE=$(printf "Today date = $(date)\n" | grep -i -o IST)
$ printf $ZONE

Alternativement, vous pouvez utiliser le -v
drapeau avec printf
pour stocker la sortie dans une variable. Vous devez passer le nom de la variable après -v
drapeau.
$ printf -v TIME "Today date = $(date)\n" $ echo $TIME

Instruction printf multiligne
Lorsque vous avez plus d'une ligne à imprimer, vous pouvez placer le texte entre guillemets doubles. De même, si vous avez une énorme ligne à imprimer sur une seule ligne et que vous souhaitez écrire la ligne en plusieurs lignes pour une meilleure lisibilité du code, vous pouvez utiliser une barre oblique inverse à la fin de chaque ligne où la ligne suivante sera considérée comme un continuation à la ligne précédente.
$ printf "\n I am running PoP_OS
It is a great OS
With Great features\n"
$ printf "I am running pop_os \
It is a great OS \
With Great features\n"

Caractères d'échappement par barre oblique inverse
Vous pouvez utiliser les caractères d'échappement antislash suivants dans printf
.
- Caractère de saut de ligne (\n)
- Onglet horizontal (\t) et onglet vertical (\v)
- Caractère de retour arrière (\b)
- Retour chariot (\r)
Discutons un par un avec des exemples.
Caractère de saut de ligne (\n)
Nous avons déjà vu le caractère de nouvelle ligne (\n
) dans toutes les sections précédentes. Caractère de saut de ligne (\n
) ajoutera une nouvelle ligne.
$ printf "Today date = $(date)\n"

Tabulation horizontale (\t) et tabulation verticale (\v)
Les caractères de tabulation horizontaux et verticaux sont utilisés pour ajouter des espaces de tabulation à votre printf
arguments.
$ printf "Today date \t $(date)\n" # HORIZONTAL TAB
$ printf "Today date \v $(date)\n" # VERTICAL TAB

Caractère de retour arrière (\b)
Caractère de retour arrière (\b
) supprimera une lettre. C'est comme appuyer sur la touche Retour arrière de notre clavier.
$ printf "It's a rain\by day..\n"

Retour chariot (\r)
Le curseur revient à la première position lors du retour chariot (\r
) est utilisé. Tout ce qui vient après \r
remplacera les caractères de la première position.
$ printf "It's a rain\by\r day..\n"

Caractère barre oblique inverse d'échappement (\)
Si vous souhaitez échapper les caractères spéciaux (\n
, \t
, \v
, \b
, \r
) et traitez-le comme une chaîne puis préfixez-le avec des doubles barres obliques inverses (\\
).
$ printf "It's a rain\\by\\r day..\n"

Quoi que vous ayez vu jusqu'à présent, vous pouvez trouver le même ensemble d'opérations dans le echo
commande aussi. Si vous connaissez déjà le echo
commande, à ce moment-là, vous auriez été très à l'aise avec le printf
commande aussi.
Spécificateurs de format Printf
Les spécificateurs de format sont un moyen de remplacer la valeur dans printf
au lieu de coder en dur la valeur dans printf
. De nombreuses lettres sont utilisées pour la substitution et chaque lettre représente un type de données particulier. Lorsque vous utilisez un spécificateur, vous devez le préfixer avec un %
symbole. Voyons quelques-uns des spécificateurs de format couramment utilisés.
Spécificateur de chaîne (%s)
Si vous souhaitez placer des chaînes dans le printf
, vous devez utiliser %s
. Jetez un oeil à l'exemple ci-dessous. J'ai un printf
déclaration et je veux substituer la valeur "United" à l'intérieur du printf
. Alors %s
est utilisé qui est un spécificateur de chaîne et lorsque vous exécutez la commande la valeur "united" sera substitué à la place de %s
.
$ printf "++ Manchester %s has a strong lineup this season" "United"

Vous pouvez passer autant d'arguments de substitution que vous le souhaitez et vous devez utiliser le même nombre de spécificateurs à l'intérieur de l'argument.
$ printf "++ %s %s has a strong lineup this %s" "Manchester" "United" "season"

Que se passe-t-il si moins de spécificateurs et plus d'arguments sont utilisés ?
Jetez un oeil à l'exemple ci-dessous. J'ai utilisé un seul spécificateur au début et j'ai passé trois arguments (chaînes) à remplacer. La façon dont printf
traite c'est-à-dire qu'il commencera à substituer le premier argument dans le premier spécificateur et que le prochain argument sera à nouveau passé au premier spécificateur puisqu'il n'y a pas d'autres spécificateurs. De cette façon, il y aura trois substitutions qui ne sont en fait pas correctes et le résultat que nous voulons.
$ printf "++ %s United has a strong lineup this Season\n" "Manchester" "United" "season"

Il existe des cas d'utilisation où ce comportement a du sens. Jetez un oeil à l'exemple ci-dessous. Je souhaite imprimer un message de bienvenue pour certains joueurs et passer leurs noms en arguments. Normalement, vous pouvez stocker la liste des noms dans un tableau et parcourir le tableau et imprimer le message. Mais c'est un moyen efficace d'obtenir le résultat en évitant l'utilisation de boucles.
$ printf "++ Welcome %s to manchester united\n" "Ronaldo" "Varane" "Jadon Sancho\n" ++ Welcome Ronaldo to manchester united ++ Welcome Varane to manchester united ++ Welcome Jadon Sancho to manchester united

Entier décimal signé (%d) et Entier décimal non signé (%u)
Pour substituer des nombres entiers singés, utilisez %d
.
$ printf ">> Welcome %s to manchester united - You get shirt number - %d\n" "Ronaldo" 7 "Varane" 19 "Jadon Sancho" 25

Pour substituer des nombres entiers non signés, utilisez %u
.
$ printf "UNSIGNED INTEGER = %u\n" 10

Si vous essayez de substituer un type de données autre qu'un entier, vous obtiendrez une erreur.
$ printf ">> Ronaldo gets no %d\n" seven

Nombre à virgule flottante (%f)
Pour remplacer les nombres à virgule flottante, utilisez %f
.
$ printf "Integer 100 to floating-point %f\n" 100

Interpréter la séquence d'échappement antislash
Vous pouvez passer des séquences d'échappement antislash comme arguments et utiliser %b
qui interprétera et développera la séquence d'échappement antislash.
$ printf "Welcome to %b Manchester united %b" "\v" "\n"

Directives de conversion Printf
Il existe des modificateurs de conversion facultatifs qui peuvent être utilisés pour formater votre printf
sorties.
%[flags][width][.precision]specifier
Modificateur de largeur
Le modificateur de largeur décide du nombre minimum de caractères dans la conversion. Si le nombre de caractères est inférieur, les espaces seront préfixés comme indiqué ci-dessous.
$ printf "%10s\n" "Ronaldo"

Si vous regardez l'image ci-dessus, le spécificateur (Ronaldo) est 7 caractères et j'ai spécifié la largeur à 10 . Dans ce cas, il ajoutera des espaces pour justifier la largeur 10 .
Vous pouvez également utiliser des modificateurs d'indicateur pour justifier l'alignement ou ajouter des zéros au lieu d'espaces. Par exemple, si la sortie doit être alignée à gauche, vous pouvez ajouter un trait d'union (-
) modificateur de drapeau.
$ printf "%-10s\n" "Ronaldo"

Dans le cas de valeurs entières et à virgule flottante, vous pouvez remplacer l'espace par des zéros en ajoutant un modificateur de drapeau zéro (0).
$ printf "%010d \n" 7

Modificateur de précision
Il s'agit d'un paramètre facultatif qui peut être utilisé pour décider du nombre de chaînes, d'entiers et de positions à virgule flottante à imprimer. Vous devez utiliser point(.) suivi de l'entier pour décider du nombre de positions à imprimer.
Jetez un oeil à l'exemple ci-dessous. J'utilise un spécificateur de chaîne et je règle le modificateur de précision sur quatre.
$ printf "%.7s\n" "Ronaldo has joined Manu"

Astérisques (*
) peut être transmis à la place des valeurs entières de précision. Les astérisques accepteront un argument pour la précision au lieu de coder en dur la valeur de précision.
$ printf "%.*s\n" 7 "Ronaldo has joined Manu"

Conclusion
Nous avons couvert pas mal d'informations sur la commande Bash printf dans cet article. Pour utiliser le printf
confortablement, pratiquez simplement tous les exemples donnés dans l'article. Printf est beaucoup plus puissant en matière de formatage que les exemples que j'ai montrés dans cet article. Si vous êtes à l'aise avec les bases, selon le cas d'utilisation, vous pouvez utiliser printf
efficacement.
Lire connexe :
- Scripts bash – Tableau indexé expliqué à l'aide d'exemples
- Scripts bash - Tableau associatif expliqué avec des exemples
- Scripts bash :boucle While et Until expliquée à l'aide d'exemples
- Scripts bash – Explication de la boucle For avec des exemples
- Scripts bash – Fonctions expliquées à l'aide d'exemples
- Tutoriel Bash Heredoc pour les débutants