Linux下使用printf打印个性化进度条

本文介绍如何在Linux终端利用ANSI转义码打印出炫酷的进度条,包括字体属性、颜色设置及光标控制等关键技术点,并通过具体代码演示了如何实现动态更新的双任务进度条。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在Linux使用yum安装插件或手动安装包时,发现安装过程各种颜色和进度条很炫酷,它们是怎么实现的呢?快来一起学习打印一个炫酷的进度条吧!

一、知识储备

1.  字体属性

代码

功能

\033[0m 关闭所有属性
\033[1m设置高亮度 
\033[4m下划线 
\033[5m 闪烁 
\033[7m 反显
\033[8m 消隐
\033[30m -- \033[37m设置前景色 (字体色)
\033[40m -- \033[47m设置背景色

 

 

 

 

 

 

 

 

 

2. 字体及背景颜色

颜色

字体色

背景色

黑色3040
红色3141
绿色3242
黄色3343
蓝色3444
紫色3545
青色3646
白色3747

 

 

 

 

 

 

 

 

 

 3. 光标控制

代码

功能

\033[nA光标上移n行 
\033[nB光标下移n行
\033[nC光标右移n行 
\033[nD光标左移n行
\033[y;xH设置光标位置 
\033[2J清空控制台
\033[K清除从光标到行尾的内容 
\033[s保存光标位置 
\033[u恢复光标位置
\033[?25l 隐藏光标 
\033[?25h 显示光标
\r 光标移动至行首

 

 

 

 

 

 

 

 

 

 

 

二、代码演示

1. 代码

package main

import
(
 "fmt"
 "time"
 "sync"
)

var wg sync.WaitGroup
func main(){

        fmt.Printf("===============================begin test ==============================\n")
        time.Sleep(time.Second)

        wg.Add(1)
        go func(){
                defer wg.Done()

                fmt.Println()
                total := 1000000
                for i:=1;i<=total;i++{

                        /*do some task*/

                        cursorUp := 1
                        cursorDown := 1

                        fmt.Printf("\r\033[%dA\033[K\033[1;44;37mTask1:[%d/%d]\033[0m" +
                                "\033[%dB\r\033[K\033[1;43;31mTask2:[%d/%d]\033[0m",
                                cursorUp, i, total, cursorDown, i*2, total*2)


                        if i == total{
                                fmt.Printf("\r\033[%dA\033[K\033[4;42;37mTask1:[success]\033[0m" +
                                        "\033[%dB\r\033[K\033[4;42;37mTask2:[success]\033[0m", cursorUp, cursorDown)
                        }
                }

                fmt.Println()
        }()

        /*do something*/
        wg.Wait()
}

2. 结果展示

     (1)运行中

         

    (2)运行结束

     

 3. for循环printf内容解析

(1)  首先 \r 使光标回到行首,\033[%dA 使光标上移一行,此时光标位于上一行行首。

(2) 使用\033[K清除光标到行尾的内容,为了防止以后的进度条信息长度不一导致结尾有上一行的显示遗留。

(3) \033[1;44;37m 设置高亮(默认为高亮,可不设置),蓝色背景,白色字体。

(4) Task1:[%d/%d] 输出进度1。

(5) \033[0m 还原设置的属性。

(6) \033[%dB\r 使光标下移一行并回到行首。

(7) 033[K 清空当前行,作用与第2步相同。

(8) \033[1;43;31m  设置高亮,黄色背景,红色字体。

(9) Task2:[%d/%d] 输出进度2。

(10) \033[0m 还原设置的属性。

(11) 循环以上操作。

(12) 达到最后一次循环,\033[4;42;37m 设置下划线,绿色背景,白色字体,打印success。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值