บทความนี้จะแสดงตัวอย่างการใช้งาน printf . ที่ใช้งานได้จริง คำสั่งใน Bash/Shell บน Linux
ที่ printf คำสั่งแสดงข้อความเหมือนกับ echo คำสั่งทำได้ แต่ช่วยให้สามารถควบคุมการจัดรูปแบบเอาต์พุตได้มากขึ้น
เป็นเครื่องมือที่มีประโยชน์ในการสร้างเอาต์พุตข้อความที่มีรูปแบบของคุณเอง โดยเฉพาะอย่างยิ่งหากคุณต้องการฝังตัวแปรในข้อความ รวมถึงการขึ้นบรรทัดใหม่ จัดแนวและจัดรูปแบบข้อความ และแม้แต่แสดงค่าที่แปลงแล้ว
printf ไวยากรณ์
คำสั่ง printf มีรูปแบบดังนี้:
printf [-v var] format [arguments]...
โปรดทราบว่า:
- The -v option บอกให้ printf เก็บผลลัพธ์ไว้ในตัวแปร var แทนที่จะพิมพ์
- รูปแบบ เป็นสตริงที่ประกอบด้วยค่าต่างๆ สามค่ารวมกัน:
- อักขระปกติซึ่งจะพิมพ์แบบคำต่อคำ
- อักขระที่ใช้ Escape กับแบ็กสแลชซึ่งมีการตีความก่อนพิมพ์
- Conversion ที่ระบุและแทนที่ด้วยอาร์กิวเมนต์ที่เกี่ยวข้อง (คิดว่าคล้ายกับตัวแปร)
- ข้อโต้แย้ง จะถูกส่งต่อไปยัง รูปแบบ และใช้ในการแปลงที่กำหนดไว้
- หากมีอาร์กิวเมนต์มากกว่าตัวระบุ Conversion ใน รูปแบบ รูปแบบ สตริงซ้ำจนกว่า อาร์กิวเมนต์ . ทั้งหมด ใช้แล้ว
- หากมีอาร์กิวเมนต์น้อยกว่า ตัวระบุตัวเลขจะถูกตั้งค่าเป็นศูนย์ และตัวระบุสตริงจะถูกตั้งค่าเป็น null
printf Escaped Characters, Conversions และ Flags
printf มีตัวเลือกมากมายที่สามารถส่งผ่านไปเพื่อจัดรูปแบบข้อความได้หลายวิธี ตัวอย่างด้านล่างจะแสดงการใช้งานจริงบางส่วนให้คุณเห็น
แทนที่จะแสดงรายการทุก ตัวเลือกที่สามารถส่งผ่านไปยังคำสั่งได้ที่นี่ คุณสามารถดูคู่มือผู้ใช้ฉบับเต็มสำหรับ printf คำสั่งบนระบบของคุณโดยเรียกใช้:
man printf
printf Bash/ตัวอย่างเชลล์
ใช่แล้วมันดีสำหรับอะไรจริง ๆ ?
การแสดงค่าที่ปัดเศษของตัวเลข
ขั้นแรก สถานการณ์ง่ายๆ – คุณต้องการจัดรูปแบบตัวเลขเป็นทศนิยมสองตำแหน่งที่จะแสดง:
printf "%.2f" 4.21423557
สิ่งนี้จะส่งออก:
4.21
รูปแบบที่ระบุ %.2f บอกให้ printf จัดรูปแบบตัวเลขเป็นทศนิยมสองตำแหน่ง ทำได้โดยใช้ความแม่นยำ คำสั่ง ซึ่งก็คือ (จุด) ในรูปแบบ
ค่านี้จะปัดเศษตัวเลขแทนที่จะตัดให้เป็นทศนิยมที่กำหนด การปัดเศษของเลขทศนิยมเป็นเรื่องแปลก – ตรวจสอบผลลัพธ์ของคุณ!
ความแปลกประหลาดของการปัดเศษ
เพื่อแสดงให้เห็นถึงความแปลกประหลาดนี้ ให้พิจารณาสิ่งต่อไปนี้:
printf "%.2f" 4.215
มันควรจะเป็น 4.22 ใช่ไหม? ผิด. ในการใช้งาน zsh ของ printf จะถูกปัดเศษเป็น:
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 ครั้งและแสดงในรูปแบบที่แตกต่างกันสามรูปแบบ
สร้างผลลัพธ์ที่สวยงาม
ตัวอย่างด้านล่างแสดงผลตารางที่จัดรูปแบบโดยใช้ printf – ฉันจะอธิบายเมื่อเราแสดงความคิดเห็น เพื่อให้ชัดเจนว่าเกิดอะไรขึ้น:
#/bin/bash # Define the format for the header text # This is a new line (\n) followed by a left-aligned string of 15 characters (%-15s), followed by a string of 15 characters (%15s), finally followed by a string of 10 characters (%10s) and another newline header_format="\n %-15s %15s %10s\n" # Define the format for the data in each row # The first two entries mirror those in the header, but the final one is a bit different - a floating number with 2 decimal places(%11.2f) row_format=" %-15s %15s %11.2f\n" # Use the printf command to print the header # The format is specified, and the arguments containing the column names for the table are supplied # printf will take the header_format, and insert the values from the attributes into it, formatted to the given specification, then print it printf "$header_format" "CAR BRAND" "COLOUR" "TOP SPEED" # Print the horizontal line under the table header # Here, printf is used to print an equals symbol. Brace expansion (the curly braces) is a shell scripting shortcut which will run the printf command for every number between 1 and 50, repeating the symbol 50 times to create a line printf '=%.0s' {1..50} # Print each row of data using the row_format. Each line (indicated by a backslash and a line return) contains three values - the car brand, colour, and top speed # Any value with a space needs to be quoted as values are separated by spaces and printf won't be able to tell where one value ends and another begins 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 – การสร้างอินเทอร์เฟซบรรทัดคำสั่งพร้อมเมนูที่สวยงามสำหรับสคริปต์ การจัดตารางผลลัพธ์ของการสืบค้นฐานข้อมูล – เป็นเครื่องมือที่มีประสิทธิภาพที่ควรมีไว้ในกระเป๋าของคุณ โดยเฉพาะอย่างยิ่งหากคุณต้องการสร้างความประทับใจให้ผู้อื่นด้วยเชลล์สคริปต์ที่ดูเรียบๆ แทนที่จะทิ้งข้อความที่ไม่ได้จัดรูปแบบไว้ หน้าจอ
คุณสามารถรวม printf กับคำสั่งจัดการข้อความอื่นๆ ใน Linux