【问题标题】:Evaluate Color Formatted Output of Command评估命令的颜色格式输出
【发布时间】:2016-03-27 00:47:59
【问题描述】:

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

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

【问题讨论】:

    标签: arrays bash shell eval indirection


    【解决方案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 参数扩展中使用的参数本身会受到扩展,除非单引号:

    • ${&lt;varName&gt;//&lt;search&gt;/&lt;replace&gt;} 将变量&lt;varName&gt; 的值中&lt;search&gt; 的所有实例替换为&lt;replace&gt;
    • 例如,'${RED}' - 由于是单引号 - 被视为文字搜索词。
    • ${RED},例如 - 由于被未引用 - 在被用作替换术语之前被扩展,因此有效地替换了 literal ${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”一词建议清除整个屏幕。

    【讨论】:

    • 我不明白为什么这有效,但确实有效!结果字符串不是相同的吗?如果这是通过动作的问题,我可以使用较短的占位符对吗?另外,我已经在全局范围内拥有这些变量,所以我不应该在这里声明它们是本地的吗? (RED、CYA 等。)最后,关于 cls 的重要提示,我说对了。
    • @akovia:看看我的更新是否解释了它。是的,您可以使用较短的占位符。如果您使用全局变量,则不必在函数内声明它们,但为了更好地封装,您可以选择这样做。
    • 感谢您展开解释。这很好用!
    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 2021-06-07
    • 2015-08-03
    • 1970-01-01
    • 2013-05-21
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多