Shell printf

作者:Erina
11 分钟阅读 1588 字

归档

Shell

目录

  1. 基本语法
  2. 格式说明符
    1. 基本示例
  3. 格式控制
    1. 宽度控制
    2. 对齐方式
    3. 前导零
  4. 字符转义
    1. 基本转义字符
    2. 八进制和十六进制转义
  5. 颜色转义
    1. Shell 颜色转义基础
    2. 基本颜色代码
    3. 样式代码
    4. 高级颜色(256色)
    5. 实用示例
    6. 实用技巧
  6. printf与echo的区别

相比常用的echo命令,我们在使用bash时经常会忽视自带的printf命令,转而使用其他语言的print函数, 但其实printf命令起源于C语言中的printf()函数,它的行为与C语言非常相似。 它提供了更多的格式化选项,让输出控制更加精确。

基本语法

Terminal window
printf "格式字符串" [参数1] [参数2] ...

其中:

格式说明符

printf支持多种格式说明符,常用的包括:

说明符说明
%s字符串
%d十进制整数
%f浮点数
%c字符
%x十六进制数(小写)
%X十六进制数(大写)
%o八进制数
%e科学计数法(小写e)
%E科学计数法(大写E)

基本示例

Terminal window
# 字符串格式化
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

格式控制

宽度控制

Terminal window
# 固定宽度输出
printf "%10s|%10s|%10s\n" "姓名" "年龄" "分数"
printf "%10s|%10d|%10.2f\n" "张三" 25 85.5
printf "%10s|%10d|%10.2f\n" "李四" 30 92.5
# 输出:
# 姓名| 年龄| 分数
# 张三| 25| 85.50
# 李四| 30| 92.50

对齐方式

Terminal window
# 左对齐(使用-)
printf "%-10s|%-10s|%-10s\n" "姓名" "年龄" "分数"
printf "%-10s|%-10d|%-10.2f\n" "张三" 25 85.5
printf "%-10s|%-10d|%-10.2f\n" "李四" 30 92.5
# 输出:
# 姓名 |年龄 |分数
# 张三 |25 |85.50
# 李四 |30 |92.50

前导零

Terminal window
# 数字前导零
printf "%05d\n" 123 # 输出:00123
printf "%010.2f\n" 3.14 # 输出:000003.1400

字符转义

基本转义字符

八进制和十六进制转义

颜色转义

我来详细介绍 Shell 中的颜色转义序列,这通常被称为 ANSI 转义码或 ANSI 颜色代码。

Shell 颜色转义基础

在 Shell 中,颜色转义是通过 ANSI 转义序列实现的,基本格式为:

Terminal window
\033[<代码>m

Terminal window
\e[<代码>m

其中:

基本颜色代码

文本颜色

背景颜色

样式代码

高级颜色(256色)

标准16色的亮色版本

背景亮色

256色模式

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"
fi
done
# 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"

实用技巧

  1. 定义颜色变量
Terminal window
# 定义常用颜色变量
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"
  1. 创建颜色函数
Terminal window
# 创建颜色输出函数
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 "这是绿色文本"
  1. 检测终端颜色支持
Terminal window
# 检测终端是否支持颜色
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
fi
fi
printf "${RED}如果支持颜色,这将是红色${NC}\n"
  1. 在脚本中创建彩色表格
Terminal window
# 创建彩色表格
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的区别

  1. 格式化能力

    • printf支持格式化字符串
    • echo只支持简单的文本输出
  2. 换行行为

    • printf默认不添加换行符
    • echo默认添加换行符