在Heredoc中进行着色,Bash

10
如果我之前定义了颜色变量,像这样:

txtred='\e[1;31m'

我该如何在heredoc中使用它:

    cat << EOM

    [colorcode here] USAGE:

EOM

我的意思是,我应该在[此处输入颜色代码]写什么,才能使那个“USAGE”文本变成红色?${txtred}行不通,因为我在整个bash脚本中都使用它,除了heredoc之外。

2个回答

12
你需要某种工具来解释转义序列,cat 无法完成这个任务。这就是为什么你需要使用 echo -e 而不是只用 echo 来使其正常工作。

你需要某种工具来解释转义序列,cat 无法完成这个任务。这就是为什么你需要使用 echo -e 而不是只用 echo 来使其正常工作。

cat << EOM
$(echo -e "${txtred} USAGE:")
EOM

工作

但您也可以使用textred=$(tput setaf 1)而无需使用转义序列,然后直接使用该变量。

textred=$(tput setaf 1)

cat <<EOM
${textred}USAGE:
EOM

好的。有没有办法保留格式,因为现在它会将“USAGE”文本向右移动? - branquito
抱歉,当我使用${tr}而不是$tr时,它现在无法工作。这是因为我需要在$trUSAGE之间插入空格。 - branquito
这是一个很好的答案!虽然我用echo替换了tput,因为我找不到重置的tput命令。所以 txtred=$(echo "\e[1;31m")reset=$(echo "\e[0m")。但是,如果你真的喜欢tput,我认为这个链接会非常有帮助 - Justin Wrobel

11
晚来一步,但另一个解决方法是通过命令替换echo -e整个heredoc块:
txtred='\e[1;31m'

echo -e "$(
cat << EOM
${txtred} USAGE:
EOM
)" # this must not be on the EOM line

NB: 必须将关闭的)"放在新行上,否则会破坏heredoc结束标记。

如果你有许多颜色要使用,并且不想使用很多子shell来设置每一个颜色,或者你已经在其他地方定义了转义代码,不想重复造轮子,那么这个选项可能是合适的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接