评估命令的颜色格式输出

Evaluate Color Formatted Output of Command

我正在使用 diff 来格式化包含 tput 颜色变量的字符串,并且在不使用“evileval 的情况下无法评估这些变量 命令。

创建字符串的命令:

output1="$(diff --changed-group-format="${RED}%=${CLS}" <(echo -e "${nstr1}") <(echo -e "${nstr2}")|tr -d '\n')"

并输出:

[String n${RED}â${CLS}m${RED}è™${CLS}]

我查看并搜索了其他答案,但除了以下内容外没有任何效果:

eval echo "${output1}"

据我所知,我的 3 个选择是 eval(不好),间接扩展(更好),和数组(最佳)。每次间接尝试都失败了。我很想使用 array 选项,但我只是看不到它在这里如何应用。我错过了什么吗?

我认为这不相关,但是发送到 diff 的变量和字符串构造在另一个问题中

您可以使用 Bash 参数扩展,如果您愿意使用一组有限的、预先已知的颜色代码:

#!/usr/bin/env bash

# Define the variables containing ANSI color sequences.
RED="$(tput setaf 1)"
CYA="$(tput setaf 6)"
CLS="$(tput sgr0)"

# Sample input string
str='[String n${RED}â${CLS}m${CYA}è™${CLS}]'

# Replace the placeholders with their corresponding variable values.
str=${str//'${RED}'/${RED}}
str=${str//'${CYA}'/${CYA}}
str=${str//'${CLS}'/${CLS}}

# Output the result.
echo "$str"

这种方法利用了这样一个事实,即 Bash 参数扩展中使用的参数本身会受到扩展,除非单引号:

  • ${<varName>//<search>/<replace>} 在变量 <varName>.
  • 的值中将 <search> 的所有实例替换为 <replace> 例如,
  • '${RED}' - 由于被 单引号 - 被视为 文字 搜索词。
  • ${RED},例如 - 由于被 未引用 - 在被用作替换词之前被 扩展 ,因此用 变量的值 ${RED}.
  • 有效地替换 literal ${RED}

包装在函数中:

printColored() {
  local str=
  local RED="$(tput setaf 1)" CYA="$(tput setaf 6)" CLS="$(tput sgr0)"
  str=${str//'${RED}'/${RED}}
  str=${str//'${CYA}'/${CYA}}
  str=${str//'${CLS}'/${CLS}}
  printf '%s\n' "$str"
}

printColored '[String n${RED}â${CLS}m${CYA}è™${CLS}]'

顺便说一句,我将 ${CLS} 重命名为 ${RST}(对于 "reset")或类似名称,因为术语 "cls" 表示清除整个屏幕。