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ประกอบด้วยสตริงรูปแบบและรายการอาร์กิวเมนต์ซึ่งพิมพ์ตามรูปแบบ คุณควรเห็นสีเป็นส่วนหนึ่งของสตริงรูปแบบและด้วยเหตุนี้จึงควรอยู่ในสตริงรูปแบบ