4

我正在使用 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)、间接扩展(更好)和数组(最好)。每次间接尝试都失败了。我很想使用数组选项,但我只是看不到它在这里如何应用。我错过了什么吗?

我认为这无关紧要,但是发送到 diff 的变量和字符串的构造在这里是另一个问题。

4

1 回答 1

1

如果您愿意使用一组有限的、预先已知的颜色代码,则可以使用 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”一词建议清除整个屏幕。

于 2015-12-21T00:12:07.673 回答