man printf.1ha una nota in fondo: "... la tua shell potrebbe avere la sua versione di printf...". Questa domanda è contrassegnata bash, ma se possibile, cerco di scrivere script portabili su qualsiasi shell. dashè di solito una linea di base minima buona per la portabilità - quindi la risposta qui lavora in bash, dash, & zsh. Se uno script funziona in quei 3, è molto probabilmente portabile praticamente ovunque.
L'ultima implementazione di printfa dash[1] non uscita Colorize dato un %sidentificatore di formato con un carattere di escape ANSI \e- ma, un identificatore di formato %bcombinato con ottale \033(equivalente a un ASCII ESC) otterrà il lavoro fatto. Si prega di commentare per eventuali valori anomali, ma AFAIK, tutte le shell sono state implementate printfper utilizzare il sottoinsieme ottale ASCII come minimo.
Al titolo della domanda "Usare i colori con printf", il modo più portabile per impostare la formattazione è combinare l' identificatore di %bformato per printf(come indicato in una risposta precedente da @Vlad) con un escape ottale \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"
Uscite:
$ ./portable-color.sh
-> This is \033[1;34m blue \033[0m text
-> This is blue text
... e "blu" è blu nella seconda riga.
L' %-6sidentificatore di formato dall'OP si trova al centro della stringa di formato tra le sequenze di caratteri di controllo di apertura e chiusura.
[1] Rif: man dashSezione "Builtins" :: "printf" :: "Format"
printfconsiste in una stringa di formato e un elenco di argomenti che vengono stampati in base al formato. Dovresti vedere i colori come parte della stringa di formato e quindi dovrebbero appartenere alla stringa di formato.