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/printfPour 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 PRINTFCommande 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 → presssImprimer 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 LINEPrintf 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)\nArguments 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.txtPIPE
printf "Today date = $(date)\n" | grep -i -o ISTRedirection 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 $ZONESortie 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 $TIMEStocker 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 TABOnglet 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 unitedPlusieurs 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" 25Entiers signés
Pour remplacer des nombres entiers non signés, utilisez %u.
printf "UNSIGNED INTEGER = %u\n" 10Entiers 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" sevenRemplacer 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" 100Substitution à 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]specifierModificateur 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" 7Remplacer 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





























