วิธีใช้คำสั่ง Bash printf บน Linux

เผยแพร่แล้ว: 2022-06-25
เทอร์มินัล Linux บนพื้นหลังสีน้ำเงิน
fatmawati achmad zaenuri/Shutterstock.com

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

กำลังเขียนไปยังเทอร์มินัล

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

วิธีใช้คำสั่ง Echo บน Linux
วิธีใช้คำสั่ง Echo บน Linux

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

คำสั่ง Bash printf สร้างแบบจำลองบนฟังก์ชัน printf จากภาษา C แต่มีความแตกต่าง หากคุณรู้จัก C คุณจะต้องระวังความแตกต่างเหล่านั้น

การเขียนสตริงพื้นฐาน

มาดูกันว่า echo และ printf แตกต่างกันอย่างไรเมื่อเขียนสตริงไปยังเทอร์มินัล

 echo นี่คือคำบางคำ
 printf นี่คือคำบางคำ 

ใช้ echo และ printf กับคำที่ไม่มีเครื่องหมายคำพูด

คำสั่ง echo พิมพ์คำทั้งหมด แต่ printf พิมพ์เฉพาะคำแรกเท่านั้น นอกจากนี้ยังไม่มีบรรทัดใหม่ที่พิมพ์โดย printf เอาต์พุตถูกผูกไว้กับพรอมต์คำสั่ง แต่สิ่งแรกก่อนอื่น เพื่อให้ printf ดำเนินการกับทุกคำ ต้องมีการอ้างอิง

 echo นี่คือคำบางคำ
 printf "นี่คือคำบางคำ" 

ใช้ echo และ printf กับคำที่ยกมา

มันดีกว่า. เรามีคำที่พิมพ์ไว้หมดแล้ว แต่ยังไม่มีการขึ้นบรรทัดใหม่ นั่นเป็นเพราะว่า printf คุณจะได้ขึ้นบรรทัดใหม่ถ้าคุณขอ อาจดูเหมือนเจ็บปวด แต่ให้คุณตัดสินใจว่าจะรวมไว้หรือไม่ หากต้องการให้ printf ออกบรรทัดใหม่ คุณต้องรวม " \n " ไว้ในสตริงของคุณ นี่คือลำดับการยกเว้น "ขึ้นบรรทัดใหม่"

 echo นี่คือคำบางคำ
 printf "นี่คือคำบางคำ\n" 

การใช้ echo และ printf กับคำที่ยกมาและอักขระขึ้นบรรทัดใหม่

บางครั้งคุณจะใช้การขึ้นบรรทัดใหม่และบางครั้งคุณจะไม่ใช้ นี่เป็นกรณีที่คำสั่ง printf หนึ่งใช้บรรทัดใหม่และอีกคำสั่งหนึ่งไม่ใช้

 printf "วิธีการ" && printf "เกินบรรยาย\n" 

ใช้ printfs สองอันเพื่อสร้างข้อความบรรทัดเดียว

เนื่องจาก printf แรกไม่พิมพ์บรรทัดใหม่ เอาต์พุตจาก printf ที่สองจะอยู่ในตำแหน่งต่อจาก "How-To" และในบรรทัดเดียวกันทันที printf ที่สองใช้ \n เพื่อพิมพ์บรรทัดใหม่ ซึ่งจะทำให้พรอมต์คำสั่งปรากฏบนบรรทัดด้านล่างข้อความที่พิมพ์

ที่เกี่ยวข้อง: วิธีประมวลผลไฟล์ทีละบรรทัดใน Linux Bash Script

ตัวละครหนีอื่น ๆ

ต่อไปนี้คืออักขระหลีกอื่นๆ ที่คุณสามารถใช้ได้ คุณได้เห็นการทำงานจริงของ “ \n ” แล้ว

  • \n : เลื่อนลงไปที่บรรทัดใหม่
  • \r : พิมพ์การคืนสินค้า สิ่งนี้จะส่งเคอร์เซอร์เอาต์พุตกลับไปที่จุดเริ่มต้นของบรรทัดปัจจุบัน
  • \t : พิมพ์อักขระแท็บ
  • \v : พิมพ์ช่องว่างแท็บแนวตั้ง
  • \\ : พิมพ์อักขระแบ็กสแลช
  • \" : พิมพ์อักขระอัญประกาศ
  • \b : พิมพ์อักขระแบ็คสเปซ

อักขระหลีกการขึ้นบรรทัดใหม่จะย้ายเคอร์เซอร์กลับไปที่จุดเริ่มต้นของบรรทัด ปัจจุบัน

 printf "น้ำผึ้งเป็นรากเหง้าของความชั่วร้ายทั้งหมด\rเงิน\n" 

การใช้อักขระขึ้นบรรทัดใหม่เพื่อเลื่อนกลับไปที่จุดเริ่มต้นของบรรทัด

คำสั่ง printf ประมวลผลอินพุตจากซ้ายไปขวา สตริงจะถูกพิมพ์เป็นข้อความปกติจนกว่า printf จะพบอักขระหลีก " \r " เคอร์เซอร์เอาต์พุตถูกย้ายกลับไปที่จุดเริ่มต้นของบรรทัดปัจจุบัน

การประมวลผลสตริงจะดำเนินการต่อด้วยตัวอักษรที่อยู่ด้านหลังอักขระ " \r " การประมวลผลส่วนที่เหลือทำให้ printf พิมพ์ "Money" โดยเขียนทับคำว่า "Honey"

เครื่องหมายอัญประกาศ “ " ” ใช้เพื่ออ้างอิงสตริง และอักขระแบ็กสแลช “ \ ” หมายถึง Escape Sequence หากคุณต้องการพิมพ์อักขระเหล่านี้ คุณจะต้องใช้แบ็กสแลช Escape อักขระ ซึ่งจะบอกให้ printf ปฏิบัติต่ออักขระเหล่านี้เป็นอักขระตามตัวอักษร

 printf "นี่คือ \tTab นี่คือเครื่องหมายอัญประกาศ \" และ \\ คือแบ็กสแลช\n" 

หลบหนีตัวละครเพื่อให้พวกเขาได้รับการปฏิบัติอย่างแท้จริง

การใช้ตัวแปร

การใช้ตัวแปรกับ printf นั้นคล้ายกับการใช้ตัวแปรเหล่านี้กับ echo หากต้องการรวมตัวแปร เช่น ตัวแปรสภาพแวดล้อมนี้ ให้นำหน้าด้วยเครื่องหมายดอลลาร์ “ $ ” ตามปกติ

 printf "โฮมไดเร็กทอรี: $HOME\n" 

การใช้ printf กับตัวแปรสภาพแวดล้อม

ที่เกี่ยวข้อง: วิธีทำงานกับตัวแปรใน Bash

รูปแบบสตริง

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

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

สิ่งเหล่านี้เป็นตัวระบุรูปแบบที่พบบ่อยที่สุด ทั้งหมดนำหน้าด้วยเครื่องหมายเปอร์เซ็นต์ “ % ” ในการพิมพ์เครื่องหมายเปอร์เซ็นต์ คุณใช้เครื่องหมายสองเปอร์เซ็นต์ร่วมกัน “ %% .”

  • %s : พิมพ์สตริง
  • %c : พิมพ์อักขระตัวเดียว
  • %d : พิมพ์จำนวนเต็ม
  • %f : พิมพ์เลขทศนิยม
  • %u : พิมพ์จำนวนเต็มที่ไม่ได้ลงนาม
  • %o : พิมพ์ค่าในฐานแปด
  • %x : พิมพ์ค่าเป็นเลขฐานสิบหกเป็นตัวพิมพ์เล็ก
  • %X : พิมพ์ค่าเป็นเลขฐานสิบหกตัวพิมพ์ใหญ่
  • %e : พิมพ์ตัวเลขทศนิยมในรูปแบบสัญกรณ์วิทยาศาสตร์ เป็นตัวพิมพ์เล็ก
  • %E : พิมพ์ตัวเลขทศนิยมในรูปแบบสัญกรณ์วิทยาศาสตร์ เป็นตัวพิมพ์ใหญ่
  • %% : พิมพ์สัญลักษณ์เปอร์เซ็นต์ “%”
 printf "วิธีการ%s\n" "เกินบรรยาย"
 printf "%s%s %s\n" "อย่างไร" "-ถึง" "เกินบรรยาย" 

กำลังแสดง printf ยอมรับอาร์กิวเมนต์ "มากเกินไป"

สตริงรูปแบบในคำสั่งแรกมีข้อความบางส่วนเป็นของตัวเอง เราส่งสตริง "Geek" เป็นอาร์กิวเมนต์เพื่อ printf จับคู่และพิมพ์โดยตัวระบุรูปแบบ “ %s ” โปรดทราบว่ามีเพียงช่องว่างระหว่างสตริงรูปแบบและสตริงอาร์กิวเมนต์ ใน C คุณต้องใช้เครื่องหมายจุลภาคเพื่อแยกพวกเขา แต่ด้วยเวอร์ชัน Bash ของ printf โดยใช้ช่องว่างก็เพียงพอแล้ว

สตริงรูปแบบที่สองมีเฉพาะตัวระบุรูปแบบและลำดับการขึ้นบรรทัดใหม่ อาร์กิวเมนต์สตริงทั้งสามถูกใช้โดยตัวระบุรูปแบบ “ %s ” แต่ละตัวในทางกลับกัน อีกครั้งใน C คุณต้องใส่เครื่องหมายจุลภาคระหว่างแต่ละอาร์กิวเมนต์ แต่ Bash printf ทำให้เราลืมเรื่องนั้นไป

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

 printf "ธ.ค.: %d\nต.ค.: %o\nเลขฐานสิบหก: %x\n" 15 15 15 

ใช้ printf เพื่อพิมพ์ค่าตัวเลขในรูปแบบฐานต่างๆ

เล็มกลับเล็กน้อยเพื่อให้ตัวอย่างดูรกน้อยลง

 printf "ฐานสิบหก: %x\n" 15 

การพิมพ์ค่าเลขฐานสิบหก

พวกเราส่วนใหญ่คุ้นเคยกับการเห็นค่าเลขฐานสิบหกเป็นตัวพิมพ์ใหญ่และมีค่าน้อยกว่า 0x10 พิมพ์ด้วยศูนย์นำหน้า เราสามารถทำได้โดยใช้ตัวระบุรูปแบบเลขฐานสิบหกตัวพิมพ์ใหญ่ " %X " และวางตัวระบุความกว้างระหว่างเครื่องหมายเปอร์เซ็นต์ " % " และอักขระ " X "

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

 printf "ฐานสิบหก: %2X\n" 15 

การพิมพ์ค่าเลขฐานสิบหกเป็นตัวพิมพ์ใหญ่ในฟิลด์ความกว้าง 2 อักขระ

ตอนนี้เราได้ค่าตัวพิมพ์ใหญ่โดยพิมพ์ด้วยช่องว่างนำหน้า เราสามารถทำให้ printf pad เป็นฟิลด์ที่มีศูนย์แทนการเว้นวรรคโดยใส่ศูนย์ไว้ข้างหน้าสองตัว:

 printf "ฐานสิบหก: %02X\n" 15 

การพิมพ์ค่าเลขฐานสิบหกเป็นตัวพิมพ์ใหญ่ในฟิลด์ความกว้าง 2 อักขระที่เสริมด้วยศูนย์

ตัวระบุความแม่นยำช่วยให้คุณกำหนดจำนวนจุดทศนิยมที่จะรวมไว้ในเอาต์พุต

 printf "จุดลอยตัว: %08.3f\n" 9.243546 

การใช้ตัวปรับความกว้างและความแม่นยำด้วยตัวเลขทศนิยม

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

 printf "ลอย: %8.3f\n" 9.243546 23.665 8.0021 

ใช้ตัวปรับแต่งความกว้างและความแม่นยำเพื่อสร้างตารางที่เรียบร้อย

คุณสามารถใช้ตัวระบุความกว้างและความแม่นยำกับสตริงได้เช่นกัน คำสั่งนี้พิมพ์สตริงในฟิลด์กว้าง 10 อักขระ

 printf "%10s %d\n" "เสื้อ" 7 "รองเท้า" 22 "ร่ม" 3 

การใช้ตัวแก้ไขความกว้างกับสตริง

โดยค่าเริ่มต้น ค่าจะปรับให้เหมาะสมในช่องของพวกเขา หากต้องการจัดชิดขอบซ้าย ให้ใช้เครื่องหมายลบ “ - ” หลังเครื่องหมายเปอร์เซ็นต์ “ %

 printf "%-10s %d" "coats" 7 "shoes" 22 "ร่ม" 3 

การใช้ตัวระบุความกว้างชิดซ้ายกับสตริง

ตัวระบุความแม่นยำสามารถใช้เพื่อกำหนดจำนวนอักขระสูงสุดที่จะพิมพ์ได้ เรากำลังใช้อักขระทวิภาค “ : ” เพื่อแสดงขีดจำกัดของฟิลด์ความกว้าง ไม่ใช่วิธีที่คำว่า "ร่ม" ถูกตัดทอน

 printf ":%10.6s:\n" "เสื้อโค้ท" "รองเท้า" "ร่ม"
 printf ":%-10.6s:\n" "เสื้อโค้ท" "รองเท้า" "ร่ม" 

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

ตัวระบุความกว้างสามารถส่งผ่านเป็น อาร์กิวเมนต์ ได้ ใช้เครื่องหมายดอกจัน “ * ” แทนตัวระบุตัวเลข และส่งความกว้างเป็นอาร์กิวเมนต์จำนวนเต็ม

 printf "%*s\n" 20 "ขวาสุด" 12 "กลาง" 5 "ซ้ายสุด" 

ส่งผ่านตัวระบุความกว้างเป็นอาร์กิวเมนต์ไปยัง printf

เคล็ดลับและนิสัยใจคออื่น ๆ

ตัวระบุรูปแบบภายในสตริงรูปแบบจะทำงานกับค่าของประเภทที่เหมาะสม ไม่ว่าจะระบุไว้ในบรรทัดคำสั่งเป็นอาร์กิวเมนต์ปกติหรือไม่ หรือจะถูกสร้างขึ้นเป็นเอาต์พุตของ นิพจน์

สิ่งนี้จะพิมพ์ผลรวมของตัวเลขสองตัว:

 printf "23+32=%d\n" $((23+32)) 

การพิมพ์ผลรวมของตัวเลขสองตัว

คำสั่งนี้พิมพ์จำนวนไดเร็กทอรีในไดเร็กทอรีการทำงานปัจจุบัน:

 printf "มี %d ไดเรกทอรี\n" $(ls -d */ | wc -l) 

การนับไดเรกทอรีด้วย printf

คำสั่ง printf นี้พิมพ์สตริงที่ส่งคืนจากการเรียกไปยังคำสั่งอื่น

 printf "ผู้ใช้ปัจจุบัน: %s\n" $(whoami) 

การพิมพ์ผลลัพธ์จากคำสั่งอื่น

หากตัวระบุรูปแบบสตริง “ %s ” ไม่ได้มาพร้อมกับอาร์กิวเมนต์ printf จะไม่พิมพ์อะไรเลย

 printf "หนึ่ง: %s สอง: %s\n" "อัลฟ่า" 

วิธีที่ printf จัดการกับอาร์กิวเมนต์สตริงที่ขาดหายไป

หากตัวระบุรูปแบบสตริง “ %s ” ให้ค่าตัวเลขโดยไม่ได้ตั้งใจ ตัวระบุรูปแบบสตริงจะพิมพ์ออกมาราวกับว่าเป็นสตริงและไม่บ่น อย่าลองทำสิ่งนี้กับ C printf สิ่งเลวร้ายจะเกิดขึ้น โปรแกรมของคุณอาจจะพัง แต่ Bash printf จัดการได้โดยไม่บ่น

 printf "หนึ่ง: %s สอง: %s\n" "อัลฟ่า" 777 

วิธีที่ printf ยอมรับจำนวนเต็มอย่างเงียบๆ เป็นค่าสตริง

หากตัวระบุรูปแบบจำนวนเต็ม “ %d ” ไม่มีอาร์กิวเมนต์ ตัวระบุรูปแบบจำนวนเต็มจะพิมพ์เป็นศูนย์

 printf "จำนวนเต็ม: %d\n" 

วิธีที่ printf จัดการกับอาร์กิวเมนต์จำนวนเต็มหายไป

หากตัวระบุรูปแบบจำนวนเต็ม “ %d ” ได้รับอาร์กิวเมนต์สตริงโดยไม่ได้ตั้งใจ Bash จะพิมพ์ข้อความแสดงข้อผิดพลาดและ printf จะพิมพ์เป็นศูนย์

 printf "จำนวนเต็ม: %d\n" "เซเว่น" 

วิธีที่ printf จัดการกับสตริงที่จัดเตรียมไว้แทนอาร์กิวเมนต์จำนวนเต็ม

สัญลักษณ์ที่น่าอึดอัดใจสามารถสร้างขึ้นได้โดยใช้หมายเลข Unicode หรือ "code point" ค่าเหล่านี้หลีกได้ด้วยตัวอักษร "u" ตามด้วยค่า Unicode

 printf "สัญลักษณ์ยูโร: \u20AC\n" 

การพิมพ์ค่า Unicode ที่ใช้ Escape

หากต้องการรวม Escape Sequence ในสตริง อาร์กิวเมนต์ คุณต้องใช้ตัวระบุรูปแบบ “ %b ” ในสตริงรูปแบบ ไม่ใช่ตัวระบุรูปแบบสตริง “ %s

 printf "%s" "\u20AC\n"
 printf "%b" "\u20AC\n" 

ใช้ตัวระบุรูปแบบ %b เพื่อจัดการลำดับการยกเว้นในอาร์กิวเมนต์สตริง

คำสั่ง printf แรกไม่ประมวลผลค่า Unicode และไม่รู้จักลำดับการขึ้นบรรทัดใหม่ คำสั่ง printf ที่สองใช้ตัวระบุรูปแบบ “ %b ” สิ่งนี้จัดการอักขระ Unicode อย่างถูกต้องและพิมพ์บรรทัดใหม่

ที่เกี่ยวข้อง: การเข้ารหัสอักขระเช่น ANSI และ Unicode คืออะไรและแตกต่างกันอย่างไร

ม้าสำหรับหลักสูตร

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

 printf "%b" "Tha-" "tha-" "tha-" "เท่านั้นแหละ\n"