man printf.1memiliki catatan di bagian bawah: "... shell Anda mungkin memiliki versi printf...". Pertanyaan ini diberi tag bash, tetapi jika memungkinkan, saya mencoba menulis skrip portabel ke shell apa pun . dashbiasanya dasar yang baik minimum untuk portabilitas - sehingga jawabannya di sini bekerja di bash, dash, & zsh. Jika sebuah skrip berfungsi pada ketiga hal tersebut, kemungkinan besar itu portabel ke mana saja.
Implementasi terbaru dari printfin dash[1] tidak mewarnai keluaran yang diberikan penentu %sformat dengan karakter escape ANSI \e- tetapi, penentu format yang %bdikombinasikan dengan oktal \033(setara dengan ASCII ESC) akan menyelesaikan pekerjaan. Harap beri komentar untuk setiap pencilan, tetapi AFAIK, semua shell telah diimplementasikan printfuntuk menggunakan subset oktal ASCII minimal.
Untuk judul pertanyaan "Menggunakan warna dengan printf", cara paling portabel untuk menyetel pemformatan adalah dengan menggabungkan penentu %bformat untuk printf(seperti yang direferensikan dalam jawaban sebelumnya dari @Vlad) dengan escape oktal \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"
Keluaran:
$ ./portable-color.sh
-> This is \033[1;34m blue \033[0m text
-> This is blue text
... dan 'biru' adalah biru di baris kedua.
Penentu %-6sformat dari OP berada di tengah string format antara urutan karakter kontrol pembuka & penutup.
[1] Ref: man dashBagian "Builtins" :: "printf" :: "Format"