bash - ANSI 转义在 `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

最佳答案

\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"

关于bash - ANSI 转义在 `printf` 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29983248/

相关文章:

python - 在python中将多个png组合成一个pdf

python - 类型错误 : key is not

PHP - 如何获取 n 深多维数组的所有数组值?

java - 有没有办法清除JAVA中对象的所有字段?

c# - 在 C# 中实现 jaccard 相似度

erlang - 执行Erlang脚本时抛出"init terminating in do_boot

java - 接口(interface)是否被视为对象?

r - 如何只保留 R 中 4 个数据帧之间的公共(public)行名?

opengl-es - 使用具有多个颜色纹理附件的 FrameBufferObject

.net - Nuget - 无法解析以前可以解析的包