我使用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”建议清除整个屏幕.