目录
1. 语法
1.1. 格式化参数
%s: 指定输出字符串。
%d、%i: 指定输出十进制整数。
%o: 指定输出八进制数。
%x、%X: 指定输出十六进制数。
%f、%F: 指定输出浮点数。
%e、%E: 以科学计数法输出浮点数。
%c: 指定输出字符。
%%: 输出一个百分号。
用法:printf '<参数>' '<字符串>'
示例:printf '%s' 'abc'
1.2. 转义符参数
\":输出一个双引号
\\:输出一个反斜杠
%%:输出一个百分号
\n:输出换行
\t:水平制表符
\v:垂直制表符
\r:输出回车
\f:换页
\a:发出警报
\b:退格
\e:删除右边一个字符
用法:printf '<参数> <字符串>'
示例:printf '\t abc'
2. 常见用法
2.1. 输出字符串
1、直接输出字符串(不会主动换行)
printf "Hello, World"
2、输出字符串后面加入换行符(换行符加入哪里,哪里开始换行)
printf "Hello, World\n"
printf "Hello, \nWorld\n"
3、于上述同理,制表符也是一样
printf "a\tb\tc\n"
4、输出一些不想转义的字符
printf "\" \n" # 输出双引号
printf "\\ \n" # 输出反斜杠
printf "%% \n" # 输出百分号
2.2. 格式化输出
1、输出字符串、整数、浮点数、科学计数法浮点数
printf "%s \n" "abc" # 输出字符串
printf "%d \n" "100" # 输出整数
printf "%.2f \n" "3.1415926" # 输出浮点数,精度为2
printf "%e \n" "3.1415926" # 输出浮点数科学计算法
2、输出多个参数(按顺序输入)
printf "%s, %d, %.2f \n" "abc" "10" "3.1415926"
3、使用变量传入参数
方法一
a="abc"
b=10
c=3.1415926
printf "%s, %d, %.2f \n" "$a" "$b" "$c"
方法二
[yt@localhost ~]$ read -r v1 v2 v3 v4 v5 <<< `seq 5`
[yt@localhost ~]$ printf "var1=%s, var2=%s, var3=%s, var4=%s, var5=%s \n" "$v1" "$v2" "$v3" "$v4" "$v5"
var1=1, var2=2, var3=3, var4=4, var5=5
方法三
[yt@localhost ~]$ data="a,b,c,d,e"
[yt@localhost ~]$ IFS=',' read -r v1 v2 v3 v4 v5 <<< "$data"
[yt@localhost ~]$ printf "var1=%s, var2=%s, var3=%s, var4=%s, var5=%s \n" "$v1" "$v2" "$v3" "$v4" "$v5"
var1=a, var2=b, var3=c, var4=d, var5=e
2.3. 设置格式对齐
1、左对齐、右对齐(区别就是左对齐使用符号 - )
# 设置宽度为10
printf "|%-10s| \n" "abc"
printf "|%10s| \n" "abc"
2、居中对齐(计算字符串宽度与总宽度之间的空格,将这些空格补全)
# 设置输出的字符串
text="abc"
# 指定总的宽度(需要大于字符串的长度)
width=10
# (总宽度 - 字符串宽度) / 2 = 空格长度,这个长度单独输出
padding=$[(${width} - ${#text}) / 2]
# 空格长度 + 字符串 + 空格长度
printf "|%${padding}s%s%${padding}s| \n" "" "$text" ""
2.4. 控制输出宽度
1、设置最小宽度
#设置宽度为5。默认右对齐,左对齐将5s改为-5s
printf "|%5s| \n" "abc"
2、设置最大宽度(超过宽度自动截断)
#设置最大宽度为5。只有左对齐
printf "|%.5s| \n" "abc"
超过指定宽度以省略号替代
printf "|%.5s...| \n" "abcdefg"
2.5. 替换补全字符
1、数字补全(指定位数,不够以0补全)
# 指定5位整数,不足以0补全
printf "%05d \n" "123"
# 指定5位浮点数,小数点精确2位,不足以0补全(小数点也算1位)
printf "%05.2f \n" "3.1415926"
2、字符串补全(printf 本身不支持字符串替换,利用 tr 命令)
# 左对齐,将空格替换为 -
printf "%-10s\n" "abc" |tr ' ' '-'
# 右对齐,将空格替换为 -
printf "%10s\n" "abc" |tr ' ' '-'
3. 设置颜色
3.1. 参数选项
设置属性(有些属性终端不支持或者需要单独配置)
重置所有文本属性:\033[0m
设置粗体:\033[1m
设置斜体:\033[3m
设置下划线:\033[4m
设置闪烁:\033[5m
设置反显(前景色与背景色互换):\033[7m
关闭闪烁和反显:\033[0m
设置文本颜色(30~37)
黑色:\033[30m
红色:\033[31m
绿色:\033[32m
黄色:\033[33m
蓝色:\033[34m
洋红:\033[35m
青色:\033[36m
白色:\033[37m
设置背景色(40~47)
黑色背景:\033[40m
红色背景:\033[41m
绿色背景:\033[42m
黄色背景:\033[43m
蓝色背景:\033[44m
洋红背景:\033[45m
青色背景:\033[46m
白色背景:\033[47m
3.2. 基本用法
1、基本用法
- printf "<属性> <字符串> <重置属性>"
2、设置文本颜色
printf "\033[31mHello World\033[0m \n"
3、设置背景颜色
printf "\033[41mHello World\033[0m \n"
3.3. 设置文本颜色
- 文本颜色:30 ~ 37
printf "\033[30m 文本黑色 \033[0m \n"
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"
3.4. 设置背景颜色
- 背景颜色:40 ~ 47
printf "\033[40m 背景黑色 \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"
4. 其他方法
4.1. 制作表格
1、通过宽度设置来制作
printf "%-20s %-20s %-20s \n" "id" "name" "avg"
printf "%-20s %-20s %-20s \n" "1" "xiao_wang" "18"
printf "%-20s %-20s %-20s \n" "2" "xiao_zhang" "20"
printf "%-20s %-20s %-20s \n" "3" "xiao_li" "16"
2、第1次优化代码,将执行方法写入函数
Output(){
printf "%-20s %-20s %-20s \n" `echo $1 |xargs -n 1`
}
Output "id name avg"
Output "1 xiao_wang 18"
Output "2 xiao_zhang 20"
Output "3 xiao_li 16"
3、第2次优化代码,增加分割线(使用perl)
# 开始前打印横线
perl -E "say '-' x 67"
function Output(){
# 输出字符串,设置每个表格宽度为20
printf "|%-20s |%-20s |%-20s |\n" `echo $1 |xargs -n 1`
# 结束后打印横线
perl -E "say '-' x 67"
}
# 向函数传入需要打印的字符串
Output "id name avg"
Output "1 xiao_wang 18"
Output "2 xiao_zhang 20"
Output "3 xiao_li 16"
4、第3次优化代码,将需要填入表格的字符串放入变量
# 将需要传入的字符串全部写入一个变量
var="
id name avg
1 xiao_wang 18
2 xiao_zhang 20
3 xiao_li 16"
# 封装一个打印表格的方法
perl -E "say '-' x 67"
function Output(){
printf "|%-20s |%-20s |%-20s |\n" `echo $1 |xargs -n 1`
perl -E "say '-' x 67"
}
# 指定循环的分隔符为换行
OLD_IFS=$IFS; IFS=$'\n'
# 遍历遍历中的字符串
for i in ${var};do
# 传入不为空的字符串到Output方法
[ -n "${i}" ] && Output ${i}
done
# 还原分隔符
IFS=$OLD_IFS
4.2. 获取硬件信息
#!/bin/bash
# CPU
cpu_name="$(grep '^model name' /proc/cpuinfo |awk -F ': ' 'NR==1{print $2}')"
cpu_proc="$(grep 'processor' /proc/cpuinfo |wc -l)"
# Memory
mem_total="$(free -h |awk '$1=="Mem:"{print $2}')"
mem_free="$(free -h |awk '$1=="Mem:"{print $4}')"
swap_total="$(free -h |awk '$1=="Swap:"{print $2}')"
swap_free="$(free -h |awk '$1=="Swap:"{print $4}')"
# Disk
dev_name="$(ls /sys/block/ |grep -vE "loop|dm|sr")"
# Network
net_name="$(ip route get 8.8.8.8 |awk -F 'dev' 'NR==1{print $2}' |awk '{print $1}')"
host="$(ip route get 8.8.8.8 |awk -F 'src' 'NR==1{print $2}' |awk '{print $1}')"
bandwidth="$(ethtool ens33 |awk '$1=="Speed:"{print $2}')"
# 封装一个输出表格的方法
echo -e "硬件信息如下:"
perl -E "say '——' x 37"
Output(){
printf "|%-20s |%-50s|\n" "$1" "$2"
perl -E "say '——' x 37"
}
# 向Output传入硬件信息
Output "CPU model name" "${cpu_name}"
Output "CPU processor" "${cpu_proc}"
Output "Memory (free/total)" "${mem_free} / ${mem_total}"
Output "Swap (free/total)" "${swap_free} / ${swap_total}"
for d in ${dev_name};do
disk_size="$(lsblk -o size -d /dev/${d} |awk 'NR==2{print $1}')"
if [[ "$d" =~ "nvme" ]];then
Output "Disk (${d})" "NVME (${disk_size})"
else
if [ `cat /sys/block/${d}/queue/rotational` -eq 1 ];then
Output "Disk (${d})" "HDD (${disk_size})"
else
Output "Disk (${d})" "SSD (${disk_size})"
fi
fi
done
Output "Network" "${host} (${net_name}, ${bandwidth})"
4.3. 实时输出百分比
#!/bin/bash
# 需要运行某个任务的次数
total_iterations=100000
for i in $(seq 1 ${total_iterations}); do
# 计算百分比(取整)
percentage=$((i * 100 / total_iterations))
# 输出百分比并保持在同一行
printf "Progress: %d%%\r" $percentage
# 运行任务
echo "$i" >> ./tmp.txt
done
# 输出最终完成状态
printf "Progress: 100%%\n"