man printf.1
มีหมายเหตุที่ด้านล่าง: "... เชลล์ของคุณอาจมีเวอร์ชันprintf
... " เป็นของตัวเอง คำถามนี้ถูกแท็กbash
แต่ถ้าเป็นไปได้ฉันพยายามเขียนสคริปต์แบบพกพาไปยังเชลล์ ใด ๆ dash
มักจะเป็นพื้นฐานขั้นต่ำที่ดีสำหรับการพกพา - ดังนั้นคำตอบที่นี่ทำงานในbash
, และdash
zsh
หากสคริปต์ทำงานใน 3 ข้อนั้นก็มักจะพกพาไปได้ทุกที่
การใช้งานล่าสุดprintf
ในdash
[1]ไม่ทำให้เอาต์พุตเป็นสีเนื่องจากตัว%s
ระบุรูปแบบที่มีอักขระหลีก ANSI \e
- แต่ตัวระบุรูปแบบที่%b
รวมกับฐานแปด\033
(เทียบเท่ากับ ASCII ESC
) จะทำให้งานเสร็จสิ้น โปรดแสดงความคิดเห็นสำหรับค่าผิดปกติใด ๆ แต่ AFAIK เชลล์ทั้งหมดได้ใช้งานprintf
เพื่อใช้ชุดย่อยฐานแปด ASCII อย่างน้อยที่สุด
กับชื่อของคำถามที่ว่า "การใช้สีที่มี printf" ที่มากที่สุดแบบพกพาวิธีการจัดรูปแบบชุดที่จะรวม%b
ตัวระบุรูปแบบprintf
(ตามที่อ้างถึงในก่อนหน้านี้คำตอบจาก @Vlad) \033
กับการหลบหนีฐานแปด
portable-color.sh
P="\033["
BLUE=34
printf "-> This is %s %-6s %s text \n" $P"1;"$BLUE"m" "blue" $P"0m"
printf "-> This is %b %-6s %b text \n" $P"1;"$BLUE"m" "blue" $P"0m"
ผลลัพธ์:
$ ./portable-color.sh
-> This is \033[1;34m blue \033[0m text
-> This is blue text
... และ 'blue' เป็นสีน้ำเงินในบรรทัดที่สอง
ตัว%-6s
ระบุรูปแบบจาก OP อยู่ตรงกลางของสตริงรูปแบบระหว่างลำดับอักขระควบคุมการเปิดและปิด
[1] อ้างอิง: man dash
ส่วน "บิวท์อิน" :: "printf" :: "รูปแบบ"
printf
ประกอบด้วยสตริงรูปแบบและรายการอาร์กิวเมนต์ซึ่งพิมพ์ตามรูปแบบ คุณควรเห็นสีเป็นส่วนหนึ่งของสตริงรูปแบบและด้วยเหตุนี้จึงควรอยู่ในสตริงรูปแบบ