man printf.1
memiliki 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 . dash
biasanya 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 printf
in dash
[1] tidak mewarnai keluaran yang diberikan penentu %s
format dengan karakter escape ANSI \e
- tetapi, penentu format yang %b
dikombinasikan dengan oktal \033
(setara dengan ASCII ESC
) akan menyelesaikan pekerjaan. Harap beri komentar untuk setiap pencilan, tetapi AFAIK, semua shell telah diimplementasikan printf
untuk menggunakan subset oktal ASCII minimal.
Untuk judul pertanyaan "Menggunakan warna dengan printf", cara paling portabel untuk menyetel pemformatan adalah dengan menggabungkan penentu %b
format 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 %-6s
format dari OP berada di tengah string format antara urutan karakter kontrol pembuka & penutup.
[1] Ref: man dash
Bagian "Builtins" :: "printf" :: "Format"