Bash/Zsh脚本问题:ASCII艺术字随机上色仅生效首个字符且数字未移除
Zsh脚本实现ASCII艺术字随机上色方案
核心思路
- 定义6种终端前景色的ANSI转义码,对应原文本中的数字1-6
- 生成1-6的随机排列,建立数字到颜色的映射,确保每个字母颜色唯一
- 逐行处理ASCII文本,替换数字为对应颜色码并移除数字,每行末尾添加颜色重置码
完整脚本实现
#!/usr/bin/env zsh # 定义6种不同的终端前景色ANSI码 typeset -A COLORS=( [1]='\e[31m' # 红色 [2]='\e[32m' # 绿色 [3]='\e[33m' # 黄色 [4]='\e[34m' # 蓝色 [5]='\e[35m' # 品红 [6]='\e[36m' # 青色 ) # 生成1-6的随机排列,作为数字到颜色的映射键 RANDOM_ORDER=($(seq 1 6 | shuf)) # 建立随机颜色映射:原数字 → 随机分配的颜色码 typeset -A RANDOM_COLORS for i in {1..6}; do RANDOM_COLORS[$i]=${COLORS[${RANDOM_ORDER[$i]}]} done # 示例ASCII艺术字(每行开头的数字1-6标记对应字母) ASCII_ART=( "1 ██████ 2 ███████ 3 ███████ 4 ███████ 5 ██████ 6 ███████" "1██ ██ 2██ ██ 3██ ██ 4██ ██ 5██ ██ 6██ ██" "1██ ██ 2███████ 3██ ██ 4███████ 5███████ 6███████ " "1██ ██ 2██ ██ 3██ ██ 4██ ██ 5██ ██ 6██ ██" "1 ██████ 2██ ██ 3 ███████ 4██ ██ 5 ██████ 6██ ██" ) # 逐行处理ASCII艺术字 for line in "${ASCII_ART[@]}"; do # 遍历每个数字1-6,替换为对应颜色码并移除数字 processed_line=$line for num in {1..6}; do processed_line=${processed_line//$num/${RANDOM_COLORS[$num]}} done # 添加颜色重置码,确保后续终端颜色正常 echo -e "${processed_line}\e[0m" done
关键细节说明
- 使用
shuf命令生成1-6的随机排列,保证每个数字对应唯一的随机颜色 - 用
${string//pattern/replacement}语法批量替换每行中的数字为颜色码,同时自然移除数字 - 每行末尾加
\e[0m重置终端颜色,避免颜色污染后续输出 - 采用数组存储ASCII艺术字,方便逐行遍历处理,对应你提到的二维遍历思路
内容的提问来源于stack exchange,提问作者Nic Aguirre
相关产品推荐
相关产品推荐

