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 ?
- Contrôle du format: permet de spécifier la largeur du champ, la précision et l'alignement.
- Sécurité du typage: les différents types de données (entiers, flottants, chaînes, etc.) ont des spécificateurs de format correspondants.
- Portabilité: le comportement est plus cohérent entre différents systèmes et shells.
- 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
- Analyser la chaîne de format ; afficher directement les caractères ordinaires lorsqu'ils sont rencontrés.
- 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.
- Après avoir traité tous les spécificateurs de format, afficher le résultat final.
Exemples pratiques
1. Utilisation de base
Exemple
printf "Hello, World!\n"
# Sortie avec variables
name="Alice"
printf "Hello, %s\n" "$name"
Exécution et sortie:
Exemple
Bonjour, monde!
Bonjour, Alice
2. Spécificateurs de format courants
Exemple
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
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
Résultat de l'exécution:
Apple 5 2.50 Orange 3 1.75
Applications étendues
1. Création d'une sortie tabulaire
Exemple
# 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
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
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
# 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
# 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équence | Description |
|---|---|
| \a | Caractère d'alerte, généralement le caractère ASCII BEL. |
| \b | Retour arrière |
| \c | Supprime (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. |
| \f | Saut de page |
| \n | Nouvelle ligne |
| \r | Retour chariot |
| \t | Tabulation horizontale |
| \v | Tabulation 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. |
| \0ddd | Un caractère représentant une valeur octale de 1 à 3 chiffres. |
Exemple
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 | - | % |