Recherche de site Web

Commande Bash Printf expliquée avec des exemples


Dans cet article, je vais expliquer l'utilisation de base de la commande Bash printf 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

Bash propose deux types de commandes qui peuvent être utilisées pour imprimer votre sortie sur le terminal. L'une est la commande echo qui est principalement utilisée à cette fin. La seconde est la commande printf.

Printf est similaire à la fonction printf en langage C mais avec son propre ensemble de fonctionnalités. La principale différence entre la commande echo et printf est que printf offre un formatage et des fonctionnalités supplémentaires par rapport à la commande echo.

Si vous n'avez jamais utilisé la commande echo auparavant, 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 la commande type 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 la commande type, reportez-vous au guide suivant :

  • Le didacticiel sur les commandes 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

Commande intégrée ou commande externe

Afficher l'aide de Bash printf

Comme je l'ai mentionné dans la section précédente, printf est intégré à bash. Vous devez ouvrir la page de manuel bash et accéder à la section printf.

man bash
/printf → presss

Imprimer l'aide

Vous pouvez également exécuter la commande suivante qui affichera la section d'aide de printf à partir de la page de manuel bash.

man bash | less --pattern='^ *printf +['

Forme de base de la commande printf

Tout au long des exemples, je comparerai la commande printf avec la commande echo pour comprendre les points communs.

Vous trouverez ci-dessous le format de la commande printf :

printf [-v var] format [arguments]

Les arguments doivent être transmis à printf, sinon cela échouera comme le montre l'image ci-dessous.

printf
echo $?

Printf sans arguments

Passez un argument et exécutez à nouveau la commande printf. 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 de nouvelle ligne comme la commande echo, 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

Printf avec caractère de nouvelle ligne

Variables et interprétation des commandes

Vous pouvez inclure n'importe quelle variable ou exécuter des commandes dans l'instruction printf. Ce comportement est similaire à la commande echo.

VAR1="Linux"
printf "$VAR1 is fun to work with\n"

Interprétation des variables et des commandes

Lecture suggérée :

  • Scripts Bash - Variables expliquées avec des 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 également le même comportement dans la commande echo. Vous devez placer les arguments entre 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'

Utilisation de guillemets simples

Lorsque vous transmettez des arguments sans guillemets, printf considérera uniquement le premier mot comme argument et l'imprimera. Il est donc nécessaire d'utiliser des guillemets autour de printf.

printf Today date = $(date)\n

Arguments sans guillemets

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 la combiner avec l'opérateur pipe 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

Redirection et tuyauterie

Lecture connexe :

  • La redirection Bash expliquée avec des exemples

Affectation d'une sortie à une variable

Parfois, vous souhaiterez peut-être stocker la sortie printf dans une variable et l'utiliser plus tard pour certains traitements. Normalement, vous exécuterez le printf entre crochets qui exécutera la commande et affectera la sortie à une variable.

ZONE=$(printf "Today date = $(date)\n" | grep -i -o IST)
printf $ZONE

Sortie affectée à une variable

Alternativement, vous pouvez utiliser l'indicateur -v avec printf pour stocker la sortie dans une variable. Vous devez passer le nom de la variable après l'indicateur -v.

printf -v TIME "Today date = $(date)\n"
echo $TIME

Stocker la sortie dans une variable

Instruction printf multiligne

Lorsque vous avez plus d’une ligne à imprimer, vous pouvez alors mettre le texte entre guillemets. De même, si vous avez une ligne énorme à imprimer sur une seule ligne et que vous souhaitez écrire la ligne sur 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 une barre oblique inverse. suite à 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"

Instruction printf multiligne

Caractères d'échappement avec barre oblique inverse

Vous pouvez utiliser les caractères d'échappement suivants avec barre oblique inverse dans printf.

  • Caractère de nouvelle 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 nouvelle ligne (\n)

Nous avons déjà vu le caractère de nouvelle ligne (\n) dans toutes les sections précédentes. Le caractère de nouvelle ligne (\n) ajoutera une nouvelle ligne.

printf "Today date = $(date)\n"

Caractère de nouvelle ligne

Onglet horizontal (\t) et onglet vertical (\v)

Les caractères de tabulation horizontaux et verticaux sont utilisés pour ajouter des espaces de tabulation à vos arguments printf.

printf "Today date \t $(date)\n" # HORIZONTAL TAB
printf "Today date \v $(date)\n" # VERTICAL TAB

Onglet horizontal et vertical

Caractère de retour arrière (\b)

Le caractère 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"

Caractère de retour arrière

Retour chariot (\r)

Le curseur revient à la première position lorsque le 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"

Retour en calèche

Caractère de barre oblique inverse d'échappement (\)

Si vous souhaitez échapper des 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"

Évasion de barre oblique inverse

Quoi que vous ayez vu jusqu'à présent, vous pouvez également trouver le même ensemble d'opérations dans la commande echo. Si vous connaissez déjà la commande echo, à ce stade, vous serez également très à l'aise avec la commande printf.

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 à l'intérieur du printf, vous devez utiliser %s. Jetez un œil à l’exemple ci-dessous. J'ai une instruction printf et je souhaite remplacer la valeur "United" à l'intérieur de printf. Donc %s est utilisé, qui est un spécificateur de chaîne et lorsque vous exécutez la commande, la valeur "united" sera remplacée à la place de %s .

printf "++ Manchester %s has a strong lineup this season" "United"

Substitution de chaîne

Vous pouvez transmettre 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"

Remplacer plusieurs arguments

Et si moins de spécificateurs et plus d’arguments étaient utilisés ?

Jetez un œil à 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 cela est la suivante : il commencera à remplacer le premier argument dans le premier spécificateur et l'argument suivant sera à nouveau transmis 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 qui correspondent au résultat souhaité.

printf "++ %s United has a strong lineup this Season\n" "Manchester" "United" "season"

Plus d'arguments passés

Il existe certains cas d'utilisation dans lesquels ce comportement est logique. Jetez un œil à l’exemple ci-dessous. Je souhaite imprimer un message de bienvenue pour certains joueurs et transmettre leurs noms en argument. Normalement, vous pouvez stocker la liste des noms dans un tableau, 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

Plusieurs arguments avec un seul spécificateur

Entier décimal signé (%d) et Entier décimal non signé (%u)

Pour remplacer des nombres entiers inscrits, utilisez %d.

printf ">> Welcome %s to manchester united - You get shirt number - %d\n" "Ronaldo" 7 "Varane" 19 "Jadon Sancho" 25

Entiers signés

Pour remplacer des nombres entiers non signés, utilisez %u.

printf "UNSIGNED INTEGER = %u\n" 10

Entiers non signés

Si vous essayez de remplacer un type de données autre qu'un nombre entier, vous obtiendrez une erreur.

printf ">> Ronaldo gets no %d\n" seven

Remplacer le mauvais type de données

Nombre à virgule flottante (%f)

Pour remplacer les nombres à virgule flottante, utilisez %f.

printf "Integer 100 to floating-point %f\n" 100

Substitution à virgule flottante

Interprétation de la séquence d'échappement de barre oblique inverse

Vous pouvez passer des séquences d'échappement de barre oblique inverse comme arguments et utiliser %b qui interprétera et développera la séquence d'échappement de barre oblique inverse.

printf "Welcome to %b Manchester united %b" "\v" "\n"

Séquence d'échappement de barre oblique inverse

Directives de conversion Printf

Il existe des modificateurs de conversion facultatifs qui peuvent être utilisés pour formater vos sorties printf.

%[flags][width][.precision]specifier

Modificateur de largeur

Le modificateur de largeur décide du nombre minimum de caractères lors de 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"

Modificateur de largeur

Si vous regardez l'image ci-dessus, le spécificateur (Ronaldo) est composé de 7 caractères et j'ai spécifié que la largeur est de 10. Dans ce cas, il ajoutera des espaces pour justifier la largeur 10.

Vous pouvez également utiliser des modificateurs de drapeau 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 modificateur de drapeau de trait d'union (-).

printf "%-10s\n" "Ronaldo"

Alignement

Dans le cas de valeurs entières et à virgule flottante, vous pouvez remplacer l'espace par des zéros en ajoutant un modificateur d'indicateur zéro (0).

printf "%010d \n" 7

Remplacer l'espace par des zéros

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 le point(.) suivi de l'entier pour décider du nombre de positions à imprimer.

Jetez un œil à 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"

Modificateur de précision de chaîne

Des astérisques (*) peuvent être transmis à la place des valeurs entières de précision. Les astérisques accepteront l'argument de précision au lieu de coder en dur la valeur de précision.

printf "%.*s\n" 7 "Ronaldo has joined Manu"

Modificateur de précision astérisques

Conclusion

Nous avons couvert de nombreuses informations sur la commande Bash printf dans cet article. Pour utiliser confortablement printf, mettez simplement en pratique tous les exemples donnés dans l'article. Printf est beaucoup plus puissant en termes 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.

Lecture connexe :

  • Scripts Bash - Tableau indexé expliqué avec des exemples
  • Scripts Bash - Tableau associatif expliqué avec des exemples
  • Script Bash - Boucle While et Until expliquée avec des exemples
  • Script Bash - Boucle For expliquée avec des exemples
  • Scripts Bash - Fonctions expliquées avec des exemples
  • Tutoriel Bash Heredoc pour les débutants

Articles connexes