Commande printf du Shell

Dans le chapitre précédent, nous avons découvert la commande Shell echo. Dans ce chapitre, nous allons découvrir une autre commande de sortie Shell, printf.

printf(print formatted) est une commande Shell de sortie formatée, dérivée de celle du langage Cprintf()fonction.

etechoContrairement à,printfil n'ajoute pas automatiquement de retours à la ligne et peut contrôler précisément le format de sortie.

printf est défini par la norme POSIX, donc les scripts utilisant printf sont plus portables que ceux utilisant echo.

printf utilise du texte entre guillemets ou des arguments séparés par des espaces, et vous pouvezprintfy utiliser des chaînes de format, et aussi spécifier la largeur de chaîne, l'alignement à gauche/droite, etc. Par défaut, printf n'ajoute pas, contrairement àecho, automatiquement de retours à la ligne ; nous pouvons les ajouter manuellement.\n。

Pourquoi utiliser printf ?

  1. Contrôle du format: permet de spécifier la largeur du champ, la précision et l'alignement.
  2. Sécurité du typage: les différents types de données (entiers, flottants, chaînes, etc.) ont des spécificateurs de format correspondants.
  3. Portabilité: le comportement est plus cohérent entre différents systèmes et shells.
  4. Sortie complexe: convient à la génération de sorties structurées telles que des tableaux et des rapports.

Syntaxe de base

La syntaxe de la commande printf :

printf  format-string  [arguments...]

Description du paramètre :

  • format-string: Une chaîne contenant des caractères ordinaires et des spécificateurs de format.
  • arguments...: Variables ou valeurs correspondant aux spécificateurs de format.

Les spécificateurs de format commencent par un%caractère, suivi d'un ou plusieurs caractères, utilisés pour spécifier le format de sortie. Les spécificateurs de format courants incluent :

  • %s: Chaîne
  • %d: Entier décimal
  • %f: Nombre à virgule flottante
  • %c: Caractère
  • %x: Nombre hexadécimal
  • %o: Nombre octal
  • %b: Nombre binaire
  • %e: Nombre à virgule flottante en notation scientifique

Workflow

  1. Analyser la chaîne de format ; afficher directement les caractères ordinaires lorsqu'ils sont rencontrés.
  2. Lorsqu'un spécificateur de format (commençant par%au début) est rencontré :
    • Lire l'argument suivant.
    • Traiter l'argument selon le format spécifié par le spécificateur.
    • Insérer le résultat dans la sortie.
  3. Après avoir traité tous les spécificateurs de format, afficher le résultat final.

Exemples pratiques

1. Utilisation de base

Exemple

# Sortie de chaîne simple
printf "Hello, World!\n"

# Sortie avec variables
name="Alice"
printf "Hello, %s\n" "$name"

Exécution et sortie:

Exemple

$ bash script.sh
Bonjour, monde!
Bonjour, Alice

2. Spécificateurs de format courants

Exemple

# Entier
printf "Décimal : %d\nHexadécimal : %x\nOctal : %o\n" 255 255 255

# Virgule flottante
printf "Flottant : %f\nScientifique : %e\n" 3.14159 3.14159

# Chaîne
printf "Nom : %s\n" "Bob"

# Caractère
printf "Première lettre : %c\n" "A"

Résultat de l'exécution:

Decimal: 255
Hex: ff
Octal: 377
Float: 3.141590
Scientific: 3.141590e+00
Name: Bob
First letter: A

3. Contrôle du formatage

Exemple

# Largeur de champ et alignement
printf "|%10s|\n|%-10s|\n" "right" "left"

# Zéros de tête dans les nombres
printf "Année: %04d\n" 23

# Précision des nombres à virgule flottante
printf "Pi: %.2f\n" 3.14159

Résultat de l'exécution:

|     right|
|left      |
Year: 0023
Pi: 3.14

4. Gestion des arguments multiples

Exemple

printf "%-10s %5d %8.2f\n" "Apple" 5 2.5 "Orange" 3 1.75

Résultat de l'exécution:

Apple          5     2.50
Orange         3     1.75

Applications étendues

1. Création d'une sortie tabulaire

Exemple

#!/bin/bash

# En-tête
printf "%-15s %10s %10s %10s\n" "Article" "Quantité" "Prix" "Total"

# Ligne de séparation
printf "%-15s %10s %10s %10s\n" "---------------" "----------" "----------" "----------"

# Lignes de données
printf "%-15s %10d %10.2f %10.2f\n" "Cahier" 3 2.50 7.50
printf "%-15s %10d %10.2f %10.2f\n" "Stylo" 5 1.20 6.00
printf "%-15s %10d %10.2f %10.2f\n" "Gomme" 2 0.50 1.00

# Ligne du total
printf "%-15s %10s %10s %10.2f\n" "" "" "Total :" 14.50

Effet de sortie:

Item            Quantity      Price      Total
--------------- ---------- ---------- ----------
Notebook               3       2.50       7.50
Pen                    5       1.20       6.00
Eraser                 2       0.50       1.00
                       Total:             14.50

2. Implémentation de la barre de progression

Exemple

#!/bin/bash

for i in {1..20}; do
    printf "\rProgression : [%-20s] %d%%" $(printf "%${i}s" | tr ' ' '#') $((i*5))
    sleep 0.1
done
printf "\n"

Effet d'exécution: Affiche une barre de progression qui grandit progressivement.

3. Sortie couleur

Exemple

#!/bin/bash

RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m' # Pas de couleur

printf "${RED}Erreur :${NC} Une erreur s'est produite\n"
printf "${GREEN}Succès :${NC} Opération terminée\n"

4. Sortie formatée

Ensuite, je vais utiliser un script pour démontrer les fonctionnalités puissantes de printf :

Exemple

#!/bin/bash
# auteur: Exemple
# url:www.example.com
 
printf "%-10s %-8s %-4s\n"Nom Sexe Poids(kg)
printf "%-10s %-8s %-4.2f\n"Guo Jing Masculin66.1234
printf "%-10s %-8s %-4.2f\n"Yang Guo Masculin48.6543
printf "%-10s %-8s %-4.2f\n"Guo Fu Femme47.9876

Exécutez le script, et la sortie est la suivante :

姓名     性别   体重kg
郭靖     男      66.12
杨过     男      48.65
郭芙     女      47.99

%s %c %d %fCe sont tous des spécificateurs de format.%sAffiche une chaîne,%dsortie d'un entier,%caffiche un caractère,%faffiche un nombre réel sous forme décimale.

%-10sFait référence à une largeur de 10 caractères (-indique un alignement à gauche ; sans cela, un alignement à droite est utilisé. Tous les caractères seront affichés dans une largeur de 10 caractères. Si insuffisant, des espaces sont automatiquement ajoutés ; si dépassé, le contenu est tout de même affiché complètement.

%-4.2fFait référence à un formatage en décimal, où.2fait référence à la conservation de 2 décimales.

Exemple

#!/bin/bash
# auteur: Exemple
# url:www.example.com
 
# format-string utilise des guillemets doubles
printf "%d %s\n" 1 "abc"

# Les guillemets simples ont le même effet que les guillemets doubles
printf '%d %s\n' 1 "abc"

# La sortie peut également être effectuée sans guillemets
printf %s abcdef

# Le format ne spécifie qu'un seul argument, mais les arguments supplémentaires sont tout de même affichés selon ce format ; format-string est réutilisé
printf %s abc def

printf "%s\n" abc def

printf "%s %s %s\n" a b c d e f g h i j

# S'il n'y a pas d'arguments, %s est remplacé par NULL et %d par 0
printf "%s et %d \n"

Exécutez le script, et la sortie est la suivante :

1 abc
1 abc
abcdefabcdefabc
def
a b c
d e f
g h i
j  
 and 0

Séquences d'échappement de printf

SéquenceDescription
\aCaractère d'alerte, généralement le caractère ASCII BEL.
\bRetour arrière
\cSupprime (n'affiche pas) tout caractère de saut de ligne final dans le résultat de sortie (valide uniquement dans les chaînes d'argument contrôlées par le spécificateur de format %b). De plus, tous les caractères restants dans l'argument, tous les arguments suivants, et tous les caractères restants dans la chaîne de format sont ignorés.
\fSaut de page
\n Nouvelle ligne
\rRetour chariot
\tTabulation horizontale
\vTabulation verticale
\\Un caractère de barre oblique inversée littéral
\ddd Un caractère représentant une valeur octale de 1 à 3 chiffres. Valide uniquement dans la chaîne de format.
\0dddUn caractère représentant une valeur octale de 1 à 3 chiffres.

Exemple

$ printf "une chaîne, aucun traitement:<%s>\n" "A\nB"
une chaîne, aucun traitement:<A\nB>

$ printf "une chaîne, aucun traitement:<%b>\n" "A\nB"
une chaîne, aucun traitement :<A
B>

$ printf "www.example.com \a"
www.example.com $                  # Pas de saut de ligne

Résumé des points clés

Révision des connaissances clés

Concept Description Exemple
Syntaxe de base printf "format" args printf "%s" "hello"
Spécificateur de format Commence par %, spécifie le type de données et le format. %d(integer),%f(virgule flottante)
Caractère d'échappement Représentation de caractère spécial \n(nouvelle ligne),\t(tabulation)
Largeur du champ Contrôle la largeur minimale de la sortie %10s(10 caractères de large)
Contrôle de précision Nombre de décimales pour les nombres à virgule flottante %.2f(2 décimales)

Tableau de référence rapide des spécificateurs de format courants

Spécificateur Objectif Exemple d'entrée Exemple de sortie
%s String "text" text
%d Entier décimal 255 255
%x Entier hexadécimal 255 ff
%f Nombre à virgule flottante 3.14159 3.141590
%.2f 2 décimales 3.14159 3.14
%c Caractère unique "A" A
%% Signe pourcentage - %
Autres extensions