man printf.1có ghi chú ở dưới cùng: "... shell của bạn có thể có phiên bản riêng của printf...". Câu hỏi này được gắn thẻ cho bash, nhưng nếu có thể, tôi cố gắng viết script di động vào bất kỳ trình bao nào . dashthường là một cơ sở tốt tối thiểu cho tính di động - vì vậy câu trả lời ở đây làm việc tại bash, dash, & zsh. Nếu một tập lệnh hoạt động trong 3 điều đó, rất có thể nó có thể di động đến bất cứ đâu.
Việc triển khai mới nhất của printftrong dash[1] không tô màu đầu ra với%s định dạng có ký tự thoát ANSI \e- nhưng, một mã định dạng %bkết hợp với bát phân \033(tương đương với ASCII ESC) sẽ hoàn thành công việc. Vui lòng nhận xét nếu có bất kỳ ngoại lệ nào, nhưng AFAIK, tất cả các shell đã triển khai printfđể sử dụng tập hợp con bát phân ASCII ở mức tối thiểu.
Đến tiêu đề của câu hỏi "Sử dụng màu sắc với printf", tính di động nhất cách để thiết lập định dạng là kết hợp các %bspecifier định dạng cho printf(như tham chiếu trong một sớm câu trả lời từ @Vlad) với một lối thoát bát phân \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"
Kết quả đầu ra:
$ ./portable-color.sh
-> This is \033[1;34m blue \033[0m text
-> This is blue text
... và 'blue' là màu xanh lam ở dòng thứ hai.
Bộ %-6schỉ định định dạng từ OP nằm ở giữa chuỗi định dạng giữa chuỗi ký tự điều khiển mở và đóng.
[1] Tham khảo: man dashPhần "Nội trang" :: "printf" :: "Định dạng"