No seu script, essas atribuições
normal='\e[0m'
yellow='\e[33m'
coloque os caracteres literalmente nas variáveis, ou seja, \ e [ 0 m , em vez da sequência de escape. Você pode construir um caractere de escape usando printf (ou algumas versões de echo ), por exemplo,
normal=$(printf '3[0m')
yellow=$(printf '3[33m')
mas você faria muito melhor usar tput , pois isso funcionará para qualquer terminal configurado corretamente:
normal=$(tput sgr0)
yellow=$(tput setaf 3)
Olhando para o seu exemplo, parece que a versão de printf que você está usando trata \e como o caractere de escape (que pode funcionar em seu sistema, mas geralmente não é portável para outros sistemas). Para ver isso, tente
yellow='\e[33m'
printf 'Yellow:%s\n' $yellow
e você veria os caracteres literal :
Yellow:\e[33m
em vez da sequência de escape. Colocá-los no formato printf informa ao printf para interpretá-los (se puder).
Leitura adicional: