数组 – 评估命令的颜色格式化输出

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

命令.

创建字符串的命令:

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(坏),间接扩展(更好)和数组(最好).每一次间接尝试都失败了.我很想使用数组选项,但我只是没有看到它将如何应用于此.我错过了什么吗?

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

最佳答案 如果您愿意使用有限的,已知的预先设置的颜色代码集,则可以使用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>}替换< search>的所有实例与< replace>在变量< varName>的值中.
例如,>’${RED}’ – 由于单引号 – 被视为文字搜索词.
> ${RED},例如 – 由于未加引号 – 在被用作替换术语之前被扩展,因此有效地用文件${RED}的值替换文字${RED}.

包含在一个功能中:

printColored() {
  local str=$1
  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}(用于“重置”)或类似的东西,因为术语“cls”建议清除整个屏幕.

点赞