06 · echo 与 printf
目标:掌握两种输出命令,会做格式化表格和彩色输出
🎯 今天要带走的三件事
echo自动换行,printf不自动换行但要手动写\necho -e才解析转义,-n不换行- 复杂/可移植输出优先用
printf
一、echo 命令
echo 是 Shell 内置命令,用于输出文本或变量的值。四个用途:信息反馈、调试、交互界面、生成文件。
基本用法
echo "Hello, World!" # 直接输出
name="Linux User"
echo "Welcome, $name!" # 输出变量
echo This is a test # 不带引号也行(但建议加引号)
常用选项
| 选项 | 作用 |
|---|---|
-n |
不换行输出 |
-e |
启用转义字符解析 |
echo -n "Loading..."
echo " Done!" # 输出:Loading... Done!
echo -e "First line\nSecond line" # \n 生效,输出两行
常用转义序列(需 -e)
\n 换行 | \t 水平制表 | \v 垂直制表 | \b 退格 | \r 回车 | \\ 反斜杠
输出到文件
echo "内容" > output.txt # 覆盖
echo "追加" >> output.txt # 追加
彩色输出(ANSI 转义码)
echo -e "\033[31mRed Text\033[0m"
echo -e "\033[42;31m绿底红字\033[0m"
- 前景色:30 黑 | 31 红 | 32 绿 | 33 黄 | 34 蓝 | 35 紫 | 36 青 | 37 白
- 背景色:40~47 对应上述颜色
\033[0m重置所有属性
输出命令结果
echo "Today is $(date)"
二、printf 命令 ⭐
printf(print formatted)源自 C 语言的 printf(),POSIX 标准定义,可移植性更好。
与 echo 的关键差异:printf 不自动加换行,要手动写 \n。
printf "format-string" [arguments...]
常用格式说明符
| 说明符 | 含义 | 示例输入 | 示例输出 |
|---|---|---|---|
%s |
字符串 | "text" |
text |
%d |
十进制整数 | 255 |
255 |
%f |
浮点数 | 3.14159 |
3.141590 |
%.2f |
2 位小数 | 3.14159 |
3.14 |
%c |
单个字符 | "A" |
A |
%x |
十六进制 | 255 |
ff |
%o |
八进制 | 255 |
377 |
%b |
二进制 | — | — |
%e |
科学计数法 | 3.14159 |
3.141590e+00 |
%% |
百分号本身 | — | % |
格式化控制
printf "|%10s|\n" "right" # 右对齐,宽 10: | right|
printf "|%-10s|\n" "left" # 左对齐: |left |
printf "Year: %04d\n" 23 # 前导零: Year: 0023
printf "Pi: %.2f\n" 3.14159 # 精度: Pi: 3.14
%-4.2f= 左对齐、宽度 4、保留 2 位小数。
实战:输出表格 ⭐
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
输出:
姓名 性别 体重kg
郭靖 男 66.12
杨过 男 48.65
郭芙 女 47.99
参数复用与缺省
printf %s abc def # abcdef(format 被复用)
printf "%s %s %s\n" a b c d e f g h i j # 自动按格式重复输出
printf "%s and %d \n" # 无参数:%s→NULL,%d→0
三、echo vs printf 对比
| 维度 | echo | printf |
|---|---|---|
| 换行 | 自动加 | 不加,需手动 \n |
| 可移植性 | 因 shell 而异 | POSIX 标准,更好 |
| 格式控制 | 无 | 宽度/精度/对齐齐全 |
| 适用 | 简单输出 | 表格、报表、结构化输出 |
🌙 今日作业
- [ ] 用
printf打印一张 3 行的对齐表格 - [ ] 用
echo -e输出一行红色文字
自测题
printf "Hello"会换行吗?为什么?%10s和%-10s的区别?- 为什么说可移植脚本建议用
printf而不是复杂echo?
👉 参考答案
1. 不会。printf 不自动加换行符,需手动写 `printf "Hello\n"`。 2. `%10s` 右对齐(不足左侧补空格);`%-10s` 左对齐(不足右侧补空格)。 3. 不同系统/Shell 的 `echo` 实现不一致(尤其 `-e`/`-n` 支持程度不同),而 printf 由 POSIX 定义,行为统一。🔗 关联
Shell-学习总览|上一课 → 05-运算符|下一课 → 07-test命令与条件测试