Arrays 计算命令的颜色格式输出

Arrays 计算命令的颜色格式输出,arrays,bash,shell,eval,indirection,Arrays,Bash,Shell,Eval,Indirection,我正在使用diff格式化一个包含tput颜色变量的字符串,如果不使用evil eval,我无法对这些变量求值 指挥部 创建字符串的命令: output1="$(diff --changed-group-format="\${RED}%=\${CLS}" <(echo -e "${nstr1}") <(echo -e "${nstr2}")|tr -d '\n')" 我已经寻找了其他答案,但除了以下答案外,没有其他答案有效: eval echo "${output1}" 从我所读到

我正在使用diff格式化一个包含tput颜色变量的字符串,如果不使用evil eval,我无法对这些变量求值 指挥部

创建字符串的命令:

output1="$(diff --changed-group-format="\${RED}%=\${CLS}" <(echo -e "${nstr1}") <(echo -e "${nstr2}")|tr -d '\n')"
我已经寻找了其他答案,但除了以下答案外,没有其他答案有效:

eval echo "${output1}"
从我所读到的内容来看,我的3个选项是evalbad、间接扩展更好和arraysbest。每一次间接的尝试都失败了。我很想使用数组选项,但我不知道它在这里是如何应用的。我错过什么了吗


我认为这不相关,但变量和发送到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参数扩展中使用的参数本身要进行扩展,除非单引号:

${//}将变量值中的所有实例替换为。 例如,${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这个术语意味着清除整个屏幕。

我不明白为什么这样做有效,但它确实有效!结果字符串不是相同的吗?如果这是一个通过议案的问题,我可以使用较短的占位符正确吗?而且,我已经全局地拥有了这些变量,所以我不应该在这里声明它们是局部的,对吗?瑞德、赛亚等。。最后,我得到了关于cls的好提示。@akovia:看看我的更新是否解释了这一点。是的,您可以使用较短的占位符。如果您使用的是全局变量,您不必在函数中声明它们,但是为了更好地封装,您可以选择这样做。感谢您扩展解释。这个很好用!
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}]'