shell函数可通过ansi转义序列实现彩色日志输出,定义red/yellow/green/nc变量封装log_err/log_warn/log_info函数,支持时间戳、调用位置、日志级别控制(log_level)及终端兼容性检测。

Shell函数可以通过封装 echo 加 ANSI 转义序列,实现带颜色的日志输出,让 错误(red)、警告(yellow)、普通信息(green 或 default) 一目了然。
定义基础颜色变量和日志函数
把常用颜色码定义为变量,提高可读性和复用性:
RED='\033[0;31m' YELLOW='\033[1;33m' GREEN='\033[0;32m' NC='\033[0m' # No Color
然后封装三个简洁函数:
log_err() { echo -e "${RED}ERROR: $* ${NC}"; }log_warn() { echo -e "${YELLOW}WARN: $* ${NC}"; }log_info() { echo -e "${GREEN}INFO: $* ${NC}"; }
调用示例:log_err "Failed to connect" → 红色显示 ERROR: Failed to connect。
增强实用性:自动添加时间戳和调用位置
加时间戳便于排查,用 ${FUNCNAME[1]} 和 ${BASH_LINENO[0]} 可显示调用处的函数名与行号:
log_err() {
local ts=$(date '+%H:%M:%S')
echo -e "${RED}[${ts}] ERROR in $(basename "$0"):${BASH_LINENO[0]} — $* ${NC}" >&2
}
&>2 把错误输出重定向到 stderr,符合 Unix 哲学;basename "$0" 避免显示完整路径,更清爽。
支持静默模式和日志级别控制
通过全局变量 LOG_LEVEL 控制输出阈值(如 0=off, 1=err, 2=warn, 3=info):
LOG_LEVEL=${LOG_LEVEL:-2}
<p>log_err() { [[ $LOG_LEVEL -ge 1 ]] && echo -e "${RED}ERROR: $<em> ${NC}" >&2; }
log_warn() { [[ $LOG_LEVEL -ge 2 ]] && echo -e "${YELLOW}WARN: $</em> ${NC}"; }
log_info() { [[ $LOG_LEVEL -ge 3 ]] && echo -e "${GREEN}INFO: $* ${NC}"; }
</p>
运行时可通过 LOG_LEVEL=3 ./script.sh 动态提升详细度,适合调试或 CI 场景。
兼容性与终端安全提醒
某些环境(如 cron、管道、非交互终端)不支持颜色,可用 tput 或检测 $TERM 自适应:
if [[ -t 1 && $TERM != "dumb" ]]; then RED=$(tput setaf 1) YELLOW=$(tput setaf 3) GREEN=$(tput setaf 2) NC=$(tput sgr0) else RED=YELLOW=GREEN=NC='' fi
这样在 ./script.sh | grep error 或无颜色终端中也不会输出乱码。











