Thursday, April 28, 2022

[SOLVED] ANSI escape codes for coloring inside bash printf

Issue

Lines 8. and 9. below confound me:

#!/bin/bash

a=foo
b=6
c=a
d="\e[33m"  # opening ansi color code for yellow text
e="\e[0m"   # ending ansi code
f=$d

printf "1. foo\n"
printf "2. $a\n"
printf "3. %s\n" "$a"
printf "4. %s\n" "${!c}"
printf "5. %${b}s\n" "$a"
printf "6. $d%s$e\n" "$a" # will be yellow
printf "7. $f%s$e\n" "$a" # will be yellow
printf '8. %s%s%s\n' "$d" "$a" "$e" # :(
printf "9. %s%s%s\n" "$f" "$a" "$e" # :(

Is it possible to use %s to expand a colour variable and see the colour switch?

Output:

1. foo
2. foo
3. foo
4. foo
5.    foo
6. foo
7. foo
8. \e[33mfoo\e[0m
9. \e[33mfoo\e[0m

Note: 6. and 7. are indeed yellow


Edit

printf "10. %b%s%b\n" "$f" "$a" "$e" # :)

... finally! That's the command that does it, thanks to Josh!


Solution

You're looking for a format specifier that will expand escape characters in the argument. Conveniently, bash supports (from help printf):

%b        expand backslash escape sequences in the corresponding argument

Alternatively, bash also supports a special mechanism by which will perform expansion of escape characters:

d=$'\e[33m'


Answered By - Josh Cartwright
Answer Checked By - Cary Denson (WPSolving Admin)