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



当尝试从shell脚本中使用ANSI颜色转义时,我完全卡住了,因为转义序列(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 passede[0m
e[31mtest failede[0m
e

被POSIX sh识别(如Honzasp所述),但33被识别。

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

通常,不要将第一个参数中的参数扩展到printf会更安全(例如,考虑FOO="hello %s"; printf "$FOO bar n" baz;)。但是,这要求您在参数中嵌入实际的转义字符,而不是printf解释为转义字符的字符串。

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

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

相关内容

  • 没有找到相关文章

最新更新