BASH 中的彩色文本功能

问题描述 投票:0回答:5

我正在尝试在 bash 中创建一个函数,它获取一个参数,并根据该参数为文本着色。说 colorText RED 会将我的文本染成红色。这是我到目前为止所写的,但它说

./colorText: line 10: ${$1}dad: bad substitution

#!/bin/bash

RED="\033[31m"
GREEN="\033[0;32m"
YELLOW="\033[0;33m"
NC="\033[0m"

colorText () {
echo $1
echo -e "${$1}dad"
}

colorText $1

最后 1 美元是因为我想使用终端中的脚本文件。

linux bash colors
5个回答
1
投票

试试这个:

$ cat tst.sh
#!/usr/bin/env bash

declare -A c
c["RED"]='31'
c["GREEN"]='32'
c["YELLOW"]='33'
c["BLACK"]='0'

colorText () {
    printf '%s\n' "$1"
    printf '\e[%sm%s\e[0m\n' "${c[$1]}" 'dad'
}

colorText "$1"

另请参阅:

  1. tput-setaf-颜色表-如何确定颜色代码
  2. 使用 awk 为 bash 中的输出着色

0
投票

因此检查

$1
是否等于RED,如果是,则输出
$RED
,对每种颜色重复。您只需打开颜色编号即可。

case "$1" in
RED) n=31; ;;
GREEN) n=32; ;;
YELLOW) n=33; ;;
esac
echo -e "\033[${n}m"

0
投票

这是一个简单的函数,它将人类可读的名称转换为 ANSI 颜色代码,并且

echo
是具有该颜色的字符串:

function color() {
  if [ "$#" -ne 2 ] ; then
    echo "[ERROR] color <color-name> <text> expected two arguments, but got $#" >&2
    return 1
  fi

  local -r colorName="$1"
  local -r message="$2"
  
  local colorCode="0;37"
  case "${colorName,,}" in
    black         ) colorCode='0;30' ;;
    red           ) colorCode='0;31' ;;
    green         ) colorCode='0;32' ;;
    yellow        ) colorCode='0;33' ;;
    blue          ) colorCode='0;34' ;;
    purple        ) colorCode='0;35' ;;
    cyan          ) colorCode='0;36' ;;
    white         ) colorCode='0;37' ;;
    bright_black  ) colorCode='0;90' ;;
    bright_red    ) colorCode='0;91' ;;
    bright_green  ) colorCode='0;92' ;;
    bright_yellow ) colorCode='0;93' ;;
    bright_blue   ) colorCode='0;94' ;;
    bright_purple ) colorCode='0;95' ;;
    bright_cyan   ) colorCode='0;96' ;;
    bright_white  ) colorCode='0;97' ;;
    gray          ) colorCode='0;90' ;;
    *         ) colorCode='0;37' ;;
  esac
 
  echo -e "\e[${colorCode}m${message}\e[0m"
}

基本用法:

color red 'something went wrong'
color green 'all good'

产生:

它总是在彩色字符串后面附加

RESET
,这样文本的其余部分就不会弄乱。因此,

echo "$(color red '[ERROR]') There were $(color red '42 errors'), build failed."

仅对

[ERROR]
42
进行着色,并保留所有其他文本的默认设置:

${   ,,}
会将颜色名称转换为小写,因此无论您写
red
RED
还是
Red
都没有关系。

这是

XTerm
配色方案的样子:


-1
投票

对 OP 当前代码进行一些小调整:

colorText () {
    local -n color="${1}"           # define local variable as nameref
    echo -e "${color}dad${NC}"      # add ${NC} to turn off colorization
}

试驾:

RED="\033[31m"
GREEN="\033[0;32m"
YELLOW="\033[0;33m"
NC="\033[0m"

colorText RED
colorText GREEN
colorText YELLOW
colorText BLUE                     # BLUE is undefined so there should be no color applied

这会生成:


-1
投票

如果您已经创建了颜色变量,则只需按原样使用它们,如下所示:

RED="\033[31m"
GREEN="\033[0;32m"
YELLOW="\033[0;33m"
NC="\033[0m"

colorText(){ echo -e "${1}dad"; }

colorText "$RED"

恕我直言,这里的功能是多余的,只需使用

echo -e
printf
与颜色变量:

printf "${RED}dad${NC}"

ps。看看这个

© www.soinside.com 2019 - 2024. All rights reserved.