I use shell scripts all the time for backup, cleanup, etc. Sometimes these scripts are long-running or include a lot of output from commands mixed with my own output. I like to distinguish my output by using colors. Errors stand out more when displayed in blood red.

We can set our terminal output color using tput. Not all terminals are created equal so we first need to determine how many colors we have available. The colors sub-command will show us the available colors in our terminal.

➤  tput colors
256

Now let’s see what all of these colors look like. We can loop through these like so:

for fg_color in {0..$(tput colors)}; do
  tput setaf $fg_color
  printf "Color $fg_color  "
done

Or if you’d like one line to paste into your terminal…

➤  for fg_color in {0..$(tput colors)}; do tput setaf $fg_color; printf "$fg_color "; done;
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 % 

The first eight colors are most likely available on the widest range of systems that are not monochrome. For this reason, our best bet is to choose the colors for our helper function from those first eight.

Now that we know what colors are available, let’s create a function to include in our shell scripts for easily printing in our choice colors. A BASH case statement should work nicely for this.

colorprintf () {
	case $1 in
		"red") tput setaf 1;;
		"green") tput setaf 2;;
		"orange") tput setaf 3;;
		"blue") tput setaf 4;;
		"purple") tput setaf 5;;
		"cyan") tput setaf 6;;
		"gray" | "grey") tput setaf 7;;
	esac
	printf "$2";
	tput sgr0
}

In the above function we use the provided argument to determine the color we want to set, set that color output with tput setaf, and print the output with printf. Notice that we use tput sgr0 at the end of the function which resets the output to default.

Now we are ready to colorprintf!

➤  colorprintf red "This should be in red\n"
This should be in red
➤  colorprintf orange "This should be in orange\n"
This should be in orange
➤  colorprintf cyan "This should be in cyan\n"
This should be in cyan
➤  colorprintf purple "This should be in purple\n"
This should be in purple

I’ve successfully used this function in Bash and Zsh but it should work in most modern Unix shells.