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

标签 bash printf sh ansi-colors

尝试使用 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/

相关文章:

mysql - 用于使用多个文件更新多个数据库的 Bash 脚本

bash - 为什么我的脚本不能在 FreeBSD 上运行,尽管它似乎可以在 Linux 上运行?就好像 FreeBSD 忽略了 "if"

bash - 找不到 AWS CodeDeploy 命令

bash - 在双引号之间插入逗号的 sed 模式

bash - 启动 emacs 时的 exec-path-from-shell 消息

使用 va_list 调用 printf

c - 如何使用 printf 在 C 中打印无穷大符号

bash - 如何使用 bash 和 printf 转换日期格式?

linux - 在所有子目录中的特定文件上运行脚本

bash - FFmpeg - 将单个 .webm 视频分成多个视频(每个视频代表屏幕的一部分),指定行数和列数