Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม Bash

เรียนรู้ Bash printf: ตัวอย่างปฏิบัติ & การจัดรูปแบบขั้นสูง

บทความนี้จะแสดงตัวอย่างปฏิบัติบางส่วนสำหรับการใช้คำสั่ง printf ใน Bash/Shell บน Linux

คำสั่ง printf สร้างเอาต์พุตข้อความคล้ายคำสั่ง echo – แต่อนุญาตให้ควบคุมการจัดรูปแบบเอาต์พุตได้มากขึ้น

มันเป็นเครื่องมือที่มีประโยชน์สำหรับสร้างเอาต์พุตข้อความที่จัดรูปแบบเอง – โดยเฉพาะหากคุณต้องการฝังตัวแปรในข้อความ รวมบรรทัดใหม่ จัดตำแหน่งและจัดรูปแบบข้อความ และแม้แต่แสดงค่าที่แปลงแล้ว

ไวยากรณ์ printf

คำสั่ง printf มีไวยากรณ์ดังนี้:

printf [-v var] format [arguments]...

โปรดสังเกตว่า:

  • ตัวเลือก -v บอก printf ให้เก็บผลลัพธ์ในตัวแปร var แทนที่จะพิมพ์ออกมา
  • format เป็นสตริงที่มีการผสมผสานของค่าที่แตกต่างกันสามประเภท:
    • ตัวอักษรปกติซึ่งจะพิมพ์ตามตัวอักษร
    • ตัวอักษรที่หนีบด้วย backslash ซึ่งจะถูกตีความก่อนพิมพ์
    • การแปลงที่ระบุและถูกแทนที่ด้วยอาร์กิวเมนต์ที่เกี่ยวข้อง (คิดว่าพวกมันค่อนข้างคล้ายตัวแปร)
  • arguments จะถูกส่งให้ format และใช้ในการแปลงที่กำหนด
    • หากมีอาร์กิวเมนต์มากกว่าตัวระบุการแปลงใน format, สตริง format จะถูกทำซ้ำจนกว่าจะใช้ arguments หมด
    • หากมีอาร์กิวเมนต์น้อยกว่า ตัวระบุนumeric จะถูกตั้งเป็นศูนย์ และตัวระบุ string จะถูกตั้งเป็น null

ตัวอักษรที่หนีบ, การแปลง, และ Flags ของ printf

printf มีตัวเลือกจำนวนมากที่สามารถส่งให้เพื่อจัดรูปแบบข้อความหลายรูปแบบ ตัวอย่างด้านล่างจะแสดงแอปพลิเคชันปฏิบัติบางส่วน

แทนที่จะรายการ ทุก ตัวเลือกที่ส่งให้คำสั่งได้ที่นี่ คุณสามารถดูคู่มือผู้ใช้เต็มรูปแบบสำหรับคำสั่ง printf บนระบบของคุณโดยรัน:

man printf

ตัวอย่าง printf Bash/Shell

ถูกต้องแล้ว ทั้งหมดนั้นมีประโยชน์อะไรบ้าง?

แสดงค่าที่ปัดเศษของตัวเลข

ก่อนอื่น สถานการณ์ง่ายๆ – คุณต้องการจัดรูปแบบตัวเลขเป็นทศนิยมสองตำแหน่งเพื่อแสดง:

printf "%.2f" 4.21423557

นี่จะสร้างเอาต์พุท:

4.21

รูปแบบที่ระบุ %.2f บอก printf ให้จัดรูปแบบตัวเลขเป็นทศนิยมสองตำแหน่ง สิ่งนี้ทำโดยใช้คำสั่ง precision ซึ่งคือ . (จุด) ในรูปแบบ

นี่จะปัดเศษตัวเลขแทนที่จะตัดทอนให้เหลือทศนิยมตามจำนวนที่กำหนด การปัดเศษของเลขจุดลอยตัวเป็นเรื่องแปลก – ดังนั้นตรวจสอบเอาต์พุทของคุณ!

ความแปลกของการปัดเศษ

เพื่อแสดงความแปลกนี้ ให้พิจารณาต่อไปนี้:

printf "%.2f" 4.215

ควรจะเป็น 4.22 ใช่ไหม? ผิด ในการใช้งาน printf ของ zsh จะปัดเศษเป็น:

4.21

เพื่อยืนยันว่าตัวเลข กำลัง ถูกปัดเศษ เราสามารถตรวจสอบค่าอื่นได้:

printf "%.2f" 4.216

ซึ่งจะคืนค่า:

4.22

… ดังนั้นตัวเลขที่ส่งให้ printf กำลัง ถูกปัดเศษ

ทำไมค่าที่ปัดเศษของ 4.215 จึงดูเหมือนจะผิด? เพื่ออธิบายอย่างง่าย เนื่องจากเป็น เลขจุดลอยตัว, ความไม่แม่นยำเกิดจากความแตกต่างระหว่างค่าที่แสดงและค่าที่คอมพิวเตอร์ใช้ในการคำนวณ

มีวิธีแก้ไข แต่อยู่นอกขอบเขตของบทความนี้ – จะครอบคลุมในอีกบทความหนึ่ง

แปลงค่า (ทศนิยม, เลขฐานสิบหก, เลขฐานแปด)

สถานการณ์ทั่วไป – คุณต้องการแสดงตัวเลขบางตัวในรูปแบบที่ต่างจากที่ได้รับจากโปรแกรมหรือสคริปต์อื่น printf ทำได้โดยใช้ไวยากรณ์การระบุการแปลง:

printf "Decimal: %d\nHexadecimal: %x\nOctal: %o\n" 64 64 64

นี่จะสร้างเอาต์พุท:

Decimal: 64 Hexadecimal: 40 Octal: 100

ตัวเลข 64 ถูกส่งให้ตัวจัดรูปแบบ 3 ครั้ง และแสดงใน 3 รูปแบบที่ต่างกัน

สร้างเอาต์พุตที่สวยงาม

ตัวอย่างด้านล่างสร้างเอาต์พุตตารางที่จัดรูปแบบโดยใช้ printf – จะอธิบายในคอมเมนต์ขณะที่ดำเนินการต่อไป เพื่อให้ชัดเจนว่ากำลังเกิดอะไรขึ้น:

#/bin/bash # กำหนดรูปแบบสำหรับข้อความส่วนหัว # นี่คือบรรทัดใหม่ (\n) ตามด้วยสตริงจัดชิดซ้าย 15 ตัวอักษร (%-15s), ตามด้วยสตริง 15 ตัวอักษร (%15s), สุดท้ายตามด้วยสตริง 10 ตัวอักษร (%10s) และบรรทัดใหม่อีกครั้ง header_format="\n %-15s %15s %10s\n" # กำหนดรูปแบบสำหรับข้อมูลในแต่ละแถว # สองรายการแรกเหมือนกับในส่วนหัว แต่รายการสุดท้ายต่างออกไปเล็กน้อย - เลขจุดลอยตัว 2 ทศนิยม(%11.2f) row_format=" %-15s %15s %11.2f\n" # ใช้คำสั่ง printf เพื่อพิมพ์ส่วนหัว # รูปแบบถูกระบุ และอาร์กิวเมนต์ที่มีชื่อคอลัมน์สำหรับตารางถูกจัดเตรียม # printf จะรับ header_format และแทรกค่าจากแอตทริบิวต์เข้าไป จัดรูปแบบตามข้อกำหนด แล้วพิมพ์ printf "$header_format" "CAR BRAND" "COLOUR" "TOP SPEED" # พิมพ์เส้นแนวนอนใต้ส่วนหัวตาราง # ที่นี่ printf ใช้พิมพ์เครื่องหมายเท่ากับ การขยายอาการ (curly braces) เป็นทางลัดของสคริปต์ Shell ซึ่งจะรันคำสั่ง printf สำหรับทุกตัวเลขระหว่าง 1 ถึง 50 ทำซ้ำสัญลักษณ์ 50 ครั้งเพื่อสร้างเส้น printf '=%.0s' {1..50} # พิมพ์แต่ละแถวของข้อมูลโดยใช้ row_format แต่ละบรรทัด (ระบุด้วย backslash และการคืนบรรทัด) มีสามค่า - ยี่ห้อรถ สี และความเร็วสูงสุด # ค่าใดๆ ที่มีช่องว่างต้องมีเครื่องหมายคำพูด เนื่องจากค่าถูกคั่นด้วยช่องว่าง และ printf จะไม่บताได้ว่าค่าหนึ่งจบและอีกค่าเริ่มที่ไหน printf "$row_format" \ Toyota Blue 100 \ Ford "Light Green" 78.3875 \ "General Motors" Purple 15.96

การรันสคริปต์นี้จะสร้างเอาต์พุท:

CAR BRAND COLOUR TOP SPEED ================================================== Toyota Blue 100.00 Ford Light Green 78.39 General Motors Purple 15.96

ดูอย่างละเอียดว่าข้อมูลถูกจัดรูปแบบโดย printf ที่นี่อย่างไร ที่ระบุความยาวตัวอักษรสำหรับส่วนหัวและแถว ข้อความจัดตำแหน่ง ความเร็วสูงสุดถูกจัดรูปแบบเป็นทศนิยมสองตำแหน่งและวางในตำแหน่งที่ถูกต้อง ข้อความจัดชิดขวา ยกเว้นที่ระบุสำหรับคอลัมน์แรก

ด้วยไวยากรณ์ที่น้อยมาก ข้อมูลที่อ่านยากกลายเป็นข้อมูลที่มีประโยชน์

ขีดจำกัดคือท้องฟ้า

คุณจะคิดเหตุผลของตัวเองในการใช้ printf – สร้างอินเทอร์เฟซบรรทัดคำสั่งด้วยเมนูสวยงามสำหรับสคริปต์ จัดตารางผลลัพธ์ของคำสั่งฐานข้อมูล – มันเป็นเครื่องมือที่ทรงพลังที่ควรมีในกระเป๋า โดยเฉพาะหากคุณต้องการประทับใจใครด้วยสคริปต์ Shell ที่ดูสวย ไม่ใช่แค่ทิ้งข้อความที่ไม่จัดรูปแบบบนหน้าจอ

คุณสามารถรวม printf กับคำสั่งจัดการข้อความอื่นๆ ใน Linux ได้