Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม BASH

การใช้คำสั่ง printf ใน Bash/Shell, With Examples

บทความนี้จะแสดงตัวอย่างการใช้งาน 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