<ก่อนหน้านี้ | Contents | ถัดไป>
printf – จัดรูปแบบและพิมพ์ข้อมูล
ต่างจากคำสั่งอื่นๆ ในบทนี้ the printf คำสั่งไม่ได้ใช้สำหรับไพพ์ไลน์ (ไม่ยอมรับอินพุตมาตรฐาน) และไม่พบแอพพลิเคชั่นบ่อยครั้งบนบรรทัดคำสั่งโดยตรง (ส่วนใหญ่จะใช้ในสคริปต์) เหตุใดจึงสำคัญ เพราะมันใช้กันอย่างแพร่หลาย
printf (จากวลี “print formatted”) เดิมพัฒนาขึ้นสำหรับภาษาโปรแกรม C และได้นำไปใช้ในภาษาการเขียนโปรแกรมหลายภาษารวมถึงเชลล์ด้วย อันที่จริงแล้วใน bash printf เป็น buildin
printf ทำงานดังนี้:
พิมพ์f “รูป" ข้อโต้แย้ง
คำสั่งจะได้รับสตริงที่มีคำอธิบายรูปแบบซึ่งนำไปใช้กับรายการอาร์กิวเมนต์ ผลลัพธ์ที่จัดรูปแบบจะถูกส่งไปยังเอาต์พุตมาตรฐาน นี่คือตัวอย่างเล็กน้อย:
[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” ในเอาต์พุตของคำสั่ง การแปลงจะใช้เพื่อจัดรูปแบบข้อมูลสตริง มีตัวระบุอื่นๆ สำหรับข้อมูลประเภทอื่นๆ ตารางนี้แสดงรายการประเภทข้อมูลที่ใช้กันทั่วไป:
ตาราง 21-4: ตัวระบุชนิดข้อมูลทั่วไปของ printf
คำอธิบายตัวระบุ
คำอธิบายตัวระบุ
d จัดรูปแบบตัวเลขเป็นจำนวนเต็มทศนิยมที่มีเครื่องหมาย
f จัดรูปแบบและส่งออกตัวเลขทศนิยม
o จัดรูปแบบจำนวนเต็มเป็นเลขฐานแปด
s จัดรูปแบบสตริง
x จัดรูปแบบจำนวนเต็มเป็นเลขฐานสิบหกโดยใช้ตัวพิมพ์เล็ก af เมื่อจำเป็น
X เหมือนกับ x แต่ใช้อักษรตัวพิมพ์ใหญ่
% พิมพ์สัญลักษณ์ % ตามตัวอักษร (เช่น ระบุ “%%”)
เราจะสาธิตผลกระทบของตัวระบุ Conversion แต่ละรายการในสตริง "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 เพื่อประมวลผล ผลลัพธ์ทั้ง XNUMX รายการแสดงผลของตัวระบุแต่ละตัว
อาจมีการเพิ่มส่วนประกอบเสริมหลายตัวลงในตัวระบุการแปลงเพื่อปรับเอาท์พุต ข้อกำหนดการแปลงที่สมบูรณ์อาจประกอบด้วยสิ่งต่อไปนี้:
%[ธง][ความกว้าง][.ความแม่นยำ]conversion_spec
เมื่อใช้ส่วนประกอบเสริมหลายตัว จะต้องปรากฏในลำดับที่ระบุด้านบนจึงจะตีความได้อย่างเหมาะสม นี่คือคำอธิบายของแต่ละรายการ:
ตารางที่ 21-5: ส่วนประกอบข้อมูลจำเพาะการแปลง printf
คำอธิบายส่วนประกอบ
คำอธิบายส่วนประกอบ
ธง มีห้าธงที่แตกต่างกัน:
# – ใช้ “รูปแบบอื่น” สำหรับผลลัพธ์ ซึ่งจะแตกต่างกันไปตามประเภทข้อมูล สำหรับการแปลง o (เลขฐานแปด) ผลลัพธ์จะถูกนำหน้าด้วย
0 สำหรับการแปลง x และ X (เลขฐานสิบหก) ผลลัพธ์จะถูกนำหน้าด้วย 0x หรือ 0X ตามลำดับ
0–(ศูนย์) แพดเอาต์พุตด้วยศูนย์ ซึ่งหมายความว่าฟิลด์นี้จะเต็มไปด้วยศูนย์นำหน้า เช่นใน “000380”
- – (เส้นประ) จัดตำแหน่งเอาต์พุตให้ชิดซ้าย ตามค่าเริ่มต้น printf จะจัดเอาต์พุตให้ชิดขวา
' ' – (ช่องว่าง) สร้างช่องว่างนำหน้าสำหรับจำนวนบวก
+ – (เครื่องหมายบวก) เซ็นตัวเลขบวก โดยค่าเริ่มต้น printf only
สัญญาณตัวเลขติดลบ
width ตัวเลขที่ระบุความกว้างฟิลด์ต่ำสุด
.ความแม่นยำ สำหรับตัวเลขทศนิยม ให้ระบุจำนวนหลักของความแม่นยำที่จะส่งออกหลังจุดทศนิยม สำหรับการแปลงสตริง ความแม่นยำ ระบุจำนวนอักขระที่จะส่งออก
ต่อไปนี้คือตัวอย่างบางส่วนของรูปแบบต่างๆ ในการใช้งานจริง:
ตาราง 21-6: ตัวอย่างข้อมูลจำเพาะการแปลงการพิมพ์
ข้อโต้แย้ง | รูปแบบ | ผล | หมายเหตุ : |
380 | "%NS" | 380 | การจัดรูปแบบอย่างง่ายของ an |
จำนวนเต็ม. | |||
380 | "%#NS" | 0x17c | จำนวนเต็มอยู่ในรูปแบบ a |
เลขฐานสิบหกโดยใช้ | |||
ธง "รูปแบบอื่น" | |||
380 | "%05d" | 00380 | จำนวนเต็มจัดรูปแบบด้วย |
ศูนย์นำหน้า (แพ็ดดิ้ง) | |||
และความกว้างของฟิลด์ขั้นต่ำ | |||
จากห้าตัวอักษร | |||
380 | "%05.5f" | 380.00000 | ตัวเลขในรูปแบบ a |
เลขทศนิยมด้วย | |||
ช่องว่างภายในและทศนิยมห้าตำแหน่ง | |||
สถานที่ที่มีความแม่นยำ ตั้งแต่ | |||
ขั้นต่ำที่กำหนด | |||
ความกว้างของฟิลด์ (5) น้อยกว่า | |||
ความกว้างที่แท้จริงของ | |||
จัดรูปแบบตัวเลข, the | |||
เบาะไม่มีผล | |||
380 | "%010.5f" | 0380.00000 | โดยการเพิ่ม |
ความกว้างของฟิลด์ขั้นต่ำถึง10 | |||
ช่องว่างภายในสามารถมองเห็นได้ในขณะนี้ | |||
380 | "%+d" | +380 | แฟล็ก + เป็นสัญญาณบวก |
จำนวน. | |||
380 | "%-NS" | 380 | ธง - ด้านซ้ายจัดตำแหน่ง |
การจัดรูปแบบ |
abcdefghijk | "%5 วินาที" | abcedfghijk | สตริงที่จัดรูปแบบด้วยความกว้างฟิลด์ต่ำสุด |
abcdefghijk | "%.5s" | ABCDE | โดยการใช้ความแม่นยำกับสตริง สตริงจะถูกตัดให้สั้นลง |
อีกครั้ง printf ส่วนใหญ่จะใช้ในสคริปต์ที่ใช้ในการจัดรูปแบบข้อมูลแบบตาราง มากกว่าในบรรทัดคำสั่งโดยตรง แต่เรายังคงสามารถแสดงให้เห็นได้ว่าสามารถนำไปใช้แก้ปัญหาการจัดรูปแบบต่างๆ ได้อย่างไร ขั้นแรก ให้ส่งออกบางฟิลด์โดยคั่นด้วยอักขระแท็บ:
[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 ~]$ พิมพ์ " \n\t \n\t\t %NS \NS
\NS \n\t \n\t\t %NS \n\t \NS \n" "หน้าหัวเรื่อง" "เนื้อหาของหน้า"
ชื่อหน้า
เนื้อหาของหน้า
[me@linuxbox ~]$ พิมพ์ " \n\t \n\t\t %NS \NS
\NS \n\t \n\t\t %NS \n\t \NS \n" "หน้าหัวเรื่อง" "เนื้อหาของหน้า"
ชื่อหน้า
เนื้อหาของหน้า