GNU/Linux >> Tutoriels Linux >  >> Linux

Bash Scripting - Commande Printf expliquée avec des exemples

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

Linux
  1. Tutoriel Bash HereDoc avec exemples

  2. Commande Linux cut expliquée avec 6 exemples

  3. Commande d'arrêt Linux expliquée avec des exemples

  4. Commande Linux Traceroute, expliquée avec des exemples

  5. '&&' vs '&' avec la commande 'test' dans Bash

Bash Scripting - Tableau indexé expliqué avec des exemples

Commande Tr sous Linux expliquée avec des exemples

w Commande expliquée avec des exemples sous Linux

Bash Scripting Part2 - Boucles For et While avec exemples

Explication de la commande Linux tee (avec exemples)

La commande Linux csplit expliquée (avec des exemples)