ANSI 转义在 `printf` 中不起作用

ANSI escapes don't work in `printf`

当尝试使用 ANSI color escapes from a shell script 时,我完全被卡住了,因为转义序列 (\e) 被逐字打印到输出中。

#!/bin/sh
GREEN="\e[32m"
RED="\e[31m"
CLEAR="\e[0m"
printf "${GREEN}test passed${CLEAR}\n"
printf "${RED}test failed${CLEAR}\n"

生产

\e[32mtest passed\e[0m
\e[31mtest failed\e[0m

解决方案是在第一行使用 #!/bin/bash 而不是 #!/bin/sh,因为原始 shprintf 不理解转义。

\e 不被 POSIX sh 识别(如 honzasp 所述),但 3 是。

GREEN='3[32m'
CLEAR='3[0m'
printf "${GREEN}testpassed${CLEAR}\n"

一般来说,不在 printf 的第一个参数内扩展参数会更安全(考虑,例如 FOO="hello %s"; printf "$FOO bar \n" baz;)。但是,这需要您在参数中嵌入 actual 转义字符,而不是 printf 解释为转义字符的字符串。

GREEN=$(printf '3[32m')
CLEAR=$(printf '3[0m')
printf '%stest passed%s' "$GREEN" "$CLEAR"