Bash ANSI转义don';我不能用printf工作`

Bash ANSI转义don';我不能用printf工作`,bash,printf,sh,ansi-colors,Bash,Printf,Sh,Ansi Colors,在尝试使用时,我完全被卡住了,因为转义序列(\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在第一行,因为原

在尝试使用时,我完全被卡住了,因为转义序列(
\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
在第一行,因为原始
sh
printf
不理解转义。

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

GREEN='\033[32m'
CLEAR='\033[0m'
printf "${GREEN}testpassed${CLEAR}\n"
通常,不将第一个参数中的参数展开为
printf
(例如,考虑
FOO=“hello%s”;printf“$FOO bar\n”baz;
)更安全。但是,这需要在参数中嵌入实际的转义字符,而不是
printf
解释为转义字符的字符串

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

我第一次花了很长时间试图找出这个问题,现在它又咬了我一口,所以我决定下次避免这种经历:)在Linux上还有一个外部命令
printf(1)
,所以用完整路径调用外部命令也可能行得通:
/usr/bin/printf“…”
(假设
printf(1)
实际上存在于您系统上的
/usr/bin
中。
绿色=$(printf'\033[32m')
可以写成
printf-v绿色'\033[32m')
以提高效率(避免子shell被分叉)。对于
CLEAR
也一样。
printf-v
不是POSIX外壳规范的一部分。