1491 字
7 分钟
Shell printf
相比常用的echo命令,我们在使用bash时经常会忽视自带的printf命令,转而使用其他语言的print函数,
但其实printf命令起源于C语言中的printf()函数,它的行为与C语言非常相似。
它提供了更多的格式化选项,让输出控制更加精确。
基本语法
printf "格式字符串" [参数1] [参数2] ...其中:
- 格式字符串:包含普通字符和格式说明符
- 参数:要格式化的值,可以有多个
格式说明符
printf支持多种格式说明符,常用的包括:
| 说明符 | 说明 |
|---|---|
| %s | 字符串 |
| %d | 十进制整数 |
| %f | 浮点数 |
| %c | 字符 |
| %x | 十六进制数(小写) |
| %X | 十六进制数(大写) |
| %o | 八进制数 |
| %e | 科学计数法(小写e) |
| %E | 科学计数法(大写E) |
基本示例
# 字符串格式化printf "Hello, %s!\n" "World"
# 数字格式化printf "Dec: %d,Hex: %x,Oct: %o\n" 255 255 255
# 浮点数格式化printf "%f,保留2位小数:%.2f\n" 3.14159 3.14159格式控制
宽度控制
# 固定宽度输出printf "%10s|%10s|%10s\n" "姓名" "年龄" "分数"printf "%10s|%10d|%10.2f\n" "张三" 25 85.5printf "%10s|%10d|%10.2f\n" "李四" 30 92.5
# 输出:# 姓名| 年龄| 分数# 张三| 25| 85.50# 李四| 30| 92.50对齐方式
# 左对齐(使用-)printf "%-10s|%-10s|%-10s\n" "姓名" "年龄" "分数"printf "%-10s|%-10d|%-10.2f\n" "张三" 25 85.5printf "%-10s|%-10d|%-10.2f\n" "李四" 30 92.5
# 输出:# 姓名 |年龄 |分数# 张三 |25 |85.50# 李四 |30 |92.50前导零
# 数字前导零printf "%05d\n" 123 # 输出:00123printf "%010.2f\n" 3.14 # 输出:000003.1400字符转义
基本转义字符
\\- 反斜杠\a- 警告字符(通常为响铃)\b- 退格\f- 换页\n- 换行\r- 回车\t- 水平制表符\v- 垂直制表符
八进制和十六进制转义
\0NNN- 八进制值 NNN (1到3位数字) 表示的字符-
- 直接使用
\NNN八进制数也可
- 直接使用
\xHH- 十六进制值 HH (1到2位数字) 表示的字符
颜色转义
我来详细介绍 Shell 中的颜色转义序列,这通常被称为 ANSI 转义码或 ANSI 颜色代码。
Shell 颜色转义基础
在 Shell 中,颜色转义是通过 ANSI 转义序列实现的,基本格式为:
\033[<代码>m或
\e[<代码>m其中:
\033或\e表示 ESC (Escape) 字符[是控制序列引导符<代码>是具体的颜色或样式代码m表示设置图形显示模式
基本颜色代码
文本颜色
30- 黑色31- 红色32- 绿色33- 黄色34- 蓝色35- 洋红色36- 青色37- 白色
背景颜色
40- 黑色背景41- 红色背景42- 绿色背景43- 黄色背景44- 蓝色背景45- 洋红色背景46- 青色背景47- 白色背景
样式代码
0- 重置所有样式1- 粗体/加亮2- 暗淡3- 斜体4- 下划线5- 慢闪烁6- 快闪烁7- 反显(前景色和背景色交换)8- 隐藏9- 删除线
高级颜色(256色)
标准16色的亮色版本
90- 亮黑色91- 亮红色92- 亮绿色93- 亮黄色94- 亮蓝色95- 亮洋红色96- 亮青色97- 亮白色
背景亮色
100- 亮黑色背景101- 亮红色背景102- 亮绿色背景103- 亮黄色背景104- 亮蓝色背景105- 亮洋红色背景106- 亮青色背景107- 亮白色背景
256色模式
38;5;<n>- 设置前景色为256色中的第n种颜色 (0-255)48;5;<n>- 设置背景色为256色中的第n种颜色 (0-255)
RGB真彩色
38;2;<r>;<g>;<b>- 设置前景色为RGB值48;2;<r>;<g>;<b>- 设置背景色为RGB值
实用示例
#!/bin/bash
# 基本颜色示例printf "\033[31m红色文本\033[0m\n"printf "\033[32m绿色文本\033[0m\n"printf "\033[33m黄色文本\033[0m\n"printf "\033[34m蓝色文本\033[0m\n"printf "\033[35m洋红色文本\033[0m\n"printf "\033[36m青色文本\033[0m\n"printf "\033[37m白色文本\033[0m\n"
# 背景颜色示例printf "\033[41m红色背景\033[0m\n"printf "\033[42m绿色背景\033[0m\n"printf "\033[43m黄色背景\033[0m\n"printf "\033[44m蓝色背景\033[0m\n"printf "\033[45m洋红色背景\033[0m\n"printf "\033[46m青色背景\033[0m\n"printf "\033[47m白色背景\033[0m\n"
# 样式示例printf "\033[1m粗体文本\033[0m\n"printf "\033[4m下划线文本\033[0m\n"printf "\033[7m反显文本\033[0m\n"
# 组合示例printf "\033[1;31m粗体红色文本\033[0m\n"printf "\033[4;33m下划线黄色文本\033[0m\n"printf "\033[1;44;37m蓝底白字粗体文本\033[0m\n"
# 256色示例for i in {0..255}; do printf "\033[38;5;${i}m颜色%03d\033[0m " $i if [ $((i % 16)) -eq 15 ]; then printf "\n" fidone
# RGB真彩色示例printf "\033[38;2;255;0;0m纯红色(RGB:255,0,0)\033[0m\n"printf "\033[38;2;0;255;0m纯绿色(RGB:0,255,0)\033[0m\n"printf "\033[38;2;0;0;255m纯蓝色(RGB:0,0,255)\033[0m\n"实用技巧
- 定义颜色变量:
# 定义常用颜色变量RED='\033[0;31m'GREEN='\033[0;32m'YELLOW='\033[0;33m'BLUE='\033[0;34m'NC='\033[0m' # No Color
# 使用变量printf "${RED}这是红色文本${NC}\n"printf "${GREEN}这是绿色文本${NC}\n"- 创建颜色函数:
# 创建颜色输出函数color_echo() { local color=$1 local text=$2
case $color in red) printf "\033[0;31m%s\033[0m\n" "$text" ;; green) printf "\033[0;32m%s\033[0m\n" "$text" ;; yellow) printf "\033[0;33m%s\033[0m\n" "$text" ;; blue) printf "\033[0;34m%s\033[0m\n" "$text" ;; *) printf "%s\n" "$text" ;; esac}
# 使用函数color_echo red "这是红色文本"color_echo green "这是绿色文本"- 检测终端颜色支持:
# 检测终端是否支持颜色if [ -t 1 ]; then ncolors=$(tput colors) if [ -n "$ncolors" ] && [ "$ncolors" -ge 8 ]; then RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color fifi
printf "${RED}如果支持颜色,这将是红色${NC}\n"- 在脚本中创建彩色表格:
# 创建彩色表格printf "+------------+------------+------------+\n"printf "|\033[36m%-12s\033[0m|\033[36m%-12s\033[0m|\033[36m%-12s\033[0m|\n" "列1" "列2" "列3"printf "+------------+------------+------------+\n"printf "|\033[32m%-12s\033[0m|\033[33m%-12s\033[0m|\033[34m%-12s\033[0m|\n" "数据1" "数据2" "数据3"printf "|\033[32m%-12s\033[0m|\033[33m%-12s\033[0m|\033[34m%-12s\033[0m|\n" "数据4" "数据5" "数据6"printf "+------------+------------+------------+\n"printf与echo的区别
-
格式化能力:
printf支持格式化字符串echo只支持简单的文本输出
-
换行行为:
printf默认不添加换行符echo默认添加换行符