You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 22:01:02