我正在尝试在 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 美元是因为我想使用终端中的脚本文件。
试试这个:
$ 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
是否等于RED,如果是,则输出$RED
,对每种颜色重复。您只需打开颜色编号即可。
case "$1" in
RED) n=31; ;;
GREEN) n=32; ;;
YELLOW) n=33; ;;
esac
echo -e "\033[${n}m"
这是一个简单的函数,它将人类可读的名称转换为 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
配色方案的样子:
对 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
这会生成:
如果您已经创建了颜色变量,则只需按原样使用它们,如下所示:
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。看看这个