printf - עיצוב והדפס נתונים
שלא כמו הפקודות האחרות בפרק זה, ה הדפס הפקודה אינה משמשת עבור קווי צינור (היא אינה מקבלת קלט סטנדרטי) ואינה מוצאת יישומים תכופים ישירות בשורת הפקודה (היא משמשת בעיקר בסקריפטים). אז למה זה חשוב? כי הוא נמצא בשימוש כה נרחב.
printf (מהביטוי "print formatted") פותחה במקור עבור שפת התכנות C והוטמעה בשפות תכנות רבות, כולל המעטפת. למעשה, ב-bash, printf הוא מובנה.
printf עובד כך:
printf "פוּרמָט" טיעונים
הפקודה ניתנת למחרוזת המכילה תיאור פורמט אשר מוחל לאחר מכן על רשימת ארגומנטים. התוצאה המעוצבת נשלחת לפלט סטנדרטי. הנה דוגמה טריוויאלית:
[me@linuxbox ~]$ printf "פירמטתי את המחרוזת: %s\n" foo
פירמטתי את המחרוזת: foo
[me@linuxbox ~]$ printf "פירמטתי את המחרוזת: %s\n" foo
פירמטתי את המחרוזת: foo
מחרוזת הפורמט עשויה להכיל טקסט מילולי (כמו "פורמטתי את המחרוזת:"), רצפי בריחה (כגון \n, תו חדש), ורצפים המתחילים ב- % תו, אשר נקראים מפרטי המרה. בדוגמה למעלה, מפרט ההמרה %s משמש כדי לעצב את המחרוזת "foo" ולהציב אותה בפלט של הפקודה. הנה זה שוב:
[me@linuxbox ~]$ printf "פירמטתי את '%s' כמחרוזת.\n" foo
פירמטתי את 'foo' כמחרוזת.
[me@linuxbox ~]$ printf "פירמטתי את '%s' כמחרוזת.\n" foo
פירמטתי את 'foo' כמחרוזת.
כפי שאנו רואים, ה- %s מפרט ההמרה מוחלף במחרוזת "foo" בפלט של הפקודה. המרה s משמשת לעיצוב נתוני מחרוזת. ישנם מפרטים אחרים לסוגים אחרים של נתונים. טבלה זו מפרטת את סוגי הנתונים הנפוצים:
טבלה 21-4: מפרטי סוג נתונים נפוצים להדפסה
תיאור המפרט
תיאור המפרט
ד עיצוב מספר כמספר שלם עשרוני בסימן.
f עצב ופלט מספר נקודה צפה.
o עיצוב מספר שלם כמספר אוקטלי.
s עיצוב מחרוזת.
x עצב מספר שלם כמספר הקסדצימלי באמצעות האותיות האותיות af במידת הצורך.
X כמו x אבל השתמש באותיות גדולות.
% הדפס סמל % מילולי (כלומר, ציין "%%")
נדגים את ההשפעה של כל אחד ממפרטי ההמרות על המחרוזת "380":
[me@linuxbox ~]$ printf "%d, %f, %o, %s, %x, %X\n" 380 380 380 380
380 380
380, 380.000000, 574, 380, 17c, 17C
[me@linuxbox ~]$ printf "%d, %f, %o, %s, %x, %X\n" 380 380 380 380
380 380
380, 380.000000, 574, 380, 17c, 17C
מכיוון שציינו שישה מפרטי המרה, עלינו לספק גם שישה ארגומנטים עבור
printf לעיבוד. שש התוצאות מציגות את ההשפעה של כל מפרט.
ניתן להוסיף מספר רכיבים אופציונליים למפרט ההמרה כדי להתאים את התפוקה שלו. מפרט המרה מלא עשוי להכיל את הדברים הבאים:
%[דגלים][רוחב][.דיוק]specific_conversion
רכיבים אופציונליים מרובים, כאשר משתמשים בהם, חייבים להופיע בסדר שצוין לעיל כדי להתפרש כראוי. הנה תיאור של כל אחד מהם:
טבלה 21-5: רכיבי מפרט המרה של printf
תיאור הרכיב
תיאור הרכיב
דגלים ישנם חמישה דגלים שונים:
# - השתמש ב"פורמט חלופי" לפלט. זה משתנה לפי סוג הנתונים. עבור המרת o (מספר אוקטלי), הפלט מקבל קידומת
0. עבור המרות x ו-X (מספר הקסדצימלי), הפלט מקבל קידומת 0x או 0X בהתאמה.
0–(אפס) רפד את הפלט באפסים. המשמעות היא שהשדה יתמלא באפסים מובילים, כמו ב-"000380".
- – (מקף) יישור לשמאל את הפלט. כברירת מחדל, printf מיישר את הפלט לימין.
' ' – (רווח) צור רווח מוביל למספרים חיוביים.
+ – (סימן פלוס) סימן מספרים חיוביים. כברירת מחדל, printf בלבד
סימן מספרים שליליים.
width מספר המציין את רוחב השדה המינימלי.
.דיוק עבור מספרי נקודה צפה, ציין את מספר ספרות הדיוק שיוצא לאחר הנקודה העשרונית. להמרת מחרוזת, דיוק מציין את מספר התווים לפלט.
הנה כמה דוגמאות לפורמטים שונים בפעולה:
טבלה 21-6: הדפס דוגמאות למפרט המרה
טיעון | פוּרמָט | תוֹצָאָה | הערות |
380 | "%d" | 380 | עיצוב פשוט של an |
מספר שלם. | |||
380 | "%#איקס" | 0x17c | מספר שלם מעוצב כ-a |
מספר הקסדצימלי באמצעות | |||
דגל "פורמט חלופי". | |||
380 | "%05d" | 00380 | מספר שלם מעוצב עם |
אפסים מובילים (ריפוד) | |||
ורוחב שדה מינימלי | |||
של חמש דמויות. | |||
380 | "%05.5f" | 380.00000 | מספר בפורמט א |
מספר נקודה צפה עם | |||
ריפוד וחמישה עשרונים | |||
מקומות של דיוק. מאז | |||
המינימום שצוין | |||
רוחב השדה (5) קטן מ | |||
הרוחב האמיתי של | |||
מספר מעוצב, ה | |||
לריפוד אין השפעה. | |||
380 | "%010.5f" | 0380.00000 | על ידי הגדלת ה |
רוחב שדה מינימלי עד 10 | |||
הריפוד נראה כעת. | |||
380 | "%+d" | +380 | הדגל + מסמן חיובי |
מספר. | |||
380 | "%-d" | 380 | הדגל - שמאלה מיישר את |
עיצוב. |
abcdefghijk | "%5s" | abcedfghijk | מחרוזת מעוצבת ברוחב שדה מינימלי. |
abcdefghijk | "%5s" | א ב ג ד ה | על ידי החלת דיוק על מחרוזת, הוא נחתך. |
שוב, הדפס משמש בעיקר בסקריפטים שבהם הוא משמש לעיצוב נתונים טבלאיים, ולא בשורת הפקודה ישירות. אבל אנחנו עדיין יכולים להראות כיצד ניתן להשתמש בו כדי לפתור בעיות עיצוב שונות. ראשית, הבה נוציא כמה שדות מופרדים על ידי תווי טאב:
[me@linuxbox ~]$ printf "%s\t%s\t%s\n" str1 str2 str3
str1 str2 str3
[me@linuxbox ~]$ printf "%s\t%s\t%s\n" str1 str2 str3
str1 str2 str3
על ידי הכנסה \t (רצף הבריחה ללשונית), אנו משיגים את האפקט הרצוי. לאחר מכן, כמה מספרים עם עיצוב מסודר:
[me@linuxbox ~]$ printf "שורה: %05d %15.3f תוצאה: %+15d\n" 1071 3.14156295 32589
קו: 01071 3.142 תוצאה: +32589
[me@linuxbox ~]$ printf "שורה: %05d %15.3f תוצאה: %+15d\n" 1071 3.14156295 32589
קו: 01071 3.142 תוצאה: +32589
זה מראה את ההשפעה של רוחב שדה מינימלי על המרווח בין השדות. או מה דעתך על עיצוב דף אינטרנט זעיר:
[me@linuxbox ~]$ printf" \n\t \n\t\t %s \n
\t \n\t \n\t\t %s \n\t \n \n" "כותרת עמוד" "תוכן עמוד"
כותרת העמוד
תוכן הדף
[me@linuxbox ~]$ printf" \n\t \n\t\t %s \n
\t \n\t \n\t\t %s \n\t \n \n" "כותרת עמוד" "תוכן עמוד"
כותרת העמוד
תוכן הדף