当我们开始学习 Bash 脚本编程时,第一个接触且频繁使用的命令大概率就是 echo,可以把它理解为其他编程语言中的 print 函数。echo 是 Bash 的内建命令(built-in),作用是将输出打印到标准输出(stdout,即终端)。
在深入 echo 命令的具体用法之前,我们先了解一下 Bash 内建命令 与 外部命令 的区别。
2. echo内建命令 vs 外部命令
在 Linux 系统中,有些命令同时以内建命令和外部命令两种形式存在。例如,/bin/echo 是一个外部命令,与 echo 这个 Bash 内建命令同名。
2.1 优先级规则
当一个命令同时以多种形式存在时,执行优先级为:
别名(alias) > 函数(function) > 内建命令(built-in) > 外部命令(PATH目录中的命令)
示例:
# 默认调用内建命令
$ echo "Hello"
# 调用外部命令(使用完整路径)
$ /bin/echo "Hello"
2.2 判断命令类型
使用 type 命令可以判断一个命令是内建还是外部:
$ type echo
echo is a shell builtin
# 显示所有位置(-a 选项)
$ type -a echo
echo is a shell builtin
echo is /usr/bin/echo
3. 查看echo命令帮助
echo 命令的帮助文档包含在 Bash 的手册页中:
# 方法一:查看Bash手册
$ man bash
# 然后输入 /echo 并按 n 键查找
# 方法二:一行命令查看
$ man bash | less --pattern='^ *echo +\['

4. echo命令的基本结构
echo [-neE] [参数...]
| 选项 |
说明 |
-n |
不追加换行符 |
-e |
启用反斜杠转义字符的解释 |
-E |
禁用反斜杠转义字符的解释(默认行为) |
示例:输出 Hello World
$ echo "Hello World"
Hello World
5. 如何抑制换行符(-n)
echo 命令默认会在输出末尾自动添加换行符(\n):
$ echo "Hello world"
Hello world
# 终端提示符会出现在新行
使用 -n 选项可以抑制这种行为:
[root@yyzcdb81 ~]# echo -n "Hello world"
Hello world[root@yyzcdb81 ~]# # 提示符在同一行
[root@yyzcdb81 ~]#
6. 无参数时的情况
当不传递任何参数给 echo 时,命令 不会失败,而是打印一个空行:
[root@yyzcdb81 ~]# echo
[root@yyzcdb81 ~]# echo $?
0
[root@yyzcdb81 ~]#
使用 -n 选项可以连空行也不打印:
[root@yyzcdb81 ~]# echo -n
[root@yyzcdb81 ~]# # 什么都不输出
实际应用场景: 当需要在输出之间添加空行时,可以使用不带参数的 echo:
echo "第一段内容"
echo
echo "第二段内容"
7. 使用变量和命令
7.1 输出环境变量
[root@yyzcdb81 ~]# echo "I am currently using ${SHELL}"
I am currently using /bin/bash
[root@yyzcdb81 ~]#
7.2 输出用户自定义变量
[root@yyzcdb81 ~]# NAME="Haopython"
[root@yyzcdb81 ~]# echo "I am using ${NAME}"
I am using Haopython
[root@yyzcdb81 ~]#
7.3 在参数中执行命令
使用 $(command) 语法可以在 echo 参数中执行命令:
[root@yyzcdb81 ~]# echo "KERNEL_VERSION=$(uname -r)"
KERNEL_VERSION=3.10.0-1160.el7.x86_64
[root@yyzcdb81 ~]#
8. 单引号 vs 双引号
8.1 不添加引号
[root@yyzcdb81 ~]# echo I am using ${NAME}
I am using Haopython # 也能正常工作
[root@yyzcdb81 ~]#
注意:始终使用引号包裹参数,避免因空格等问题导致的意外行为。
8.2 单引号 vs 双引号的区别
| 引号类型 |
行为 |
示例 |
双引号 " |
允许变量扩展和命令替换 |
echo "I am ${NAME}" → I am Haopython |
单引号 ' |
禁止扩展,视为纯文本 |
echo 'I am ${NAME}' → I am ${NAME} |
# 单引号:变量不会被解释
[root@yyzcdb81 ~]# echo 'I am using ${NAME}'
I am using ${NAME}
[root@yyzcdb81 ~]#
# 双引号:变量会被解释
[root@yyzcdb81 ~]# echo "I am using ${NAME}"
I am using Haopython
[root@yyzcdb81 ~]#
9. 输出重定向与管道
9.1 重定向到文件(>)
[root@yyzcdb81 ~]# echo "Welcome to Haopython" > /tmp/op.log
[root@yyzcdb81 ~]# cat /tmp/op.log
Welcome to Haopython
[root@yyzcdb81 ~]#
9.2 追加到文件(>>)
[root@yyzcdb81 ~]# echo "Site:Haopython" >> /tmp/op.log
[root@yyzcdb81 ~]#
9.3 管道传递给其他命令
[root@yyzcdb81 ~]# echo "I am using ${NAME}"
I am using Haopython
[root@yyzcdb81 ~]# echo "I am using ${NAME}" | grep -i -o "python"
python
[root@yyzcdb81 ~]#
10. 多行字符串
10.1 输出多行(保留换行)
[root@yyzcdb81 ~]# echo "This is Line 1
> This is Line 2
> This is Line 3"
This is Line 1
This is Line 2
This is Line 3
[root@yyzcdb81 ~]#
10.2 多行合并为单行(使用 \ 续行符)
[root@yyzcdb81 ~]# echo "I am running \
> the echo command \
> again"
I am running the echo command again
[root@yyzcdb81 ~]#
技巧: 使用 \ 续行符可以将过长的命令拆分为多行,提高可读性。
11. 反斜杠转义字符(-e选项)
使用 -e 选项可以启用转义字符的解释。常用转义字符如下:
| 转义字符 |
说明 |
示例效果 |
\n |
换行符 |
在 \n 处换行 |
\t |
水平制表符(Tab) |
添加Tab空格 |
\v |
垂直制表符 |
垂直制表 |
\c |
抑制输出 |
\c 之后的内容不显示 |
\r |
回车符 |
光标回到行首 |
\\ |
反斜杠本身 |
输出一个 \ |
11.1 换行符(\n)
[root@yyzcdb81 ~]# echo -e "This is the first line\nThis is the second line"
This is the first line
This is the second line
[root@yyzcdb81 ~]#
11.2 水平制表符(\t)
[root@yyzcdb81 ~]# echo -e "Enter the U_NAME\t:\n"
Enter the U_NAME :
[root@yyzcdb81 ~]#
11.3 垂直制表符(\v)
[root@yyzcdb81 ~]# echo -e "Enter the username\vEnter the password"
Enter the username
Enter the password
[root@yyzcdb81 ~]#
11.4 抑制后续输出(\c)
[root@yyzcdb81 ~]# echo -e "I am using \cCosmic Desktop"
I am using [root@yyzcdb81 ~]#
11.5 回车符(\r)
回车符会将光标重置到行首,后面的内容会覆盖前面的内容:
[root@yyzcdb81 ~]# echo -e "I use Arch, \rBtw"
Btwse Arch,
[root@yyzcdb81 ~]#
输出过程:I use Arch, → 光标回到行首 → 输出 Btw 覆盖前4个字符 → 最终显示 Btwse Arch,
12. 禁用转义字符解释(-E选项)
-E 选项是 echo 命令的 默认行为,即禁用转义字符的解释:
# 默认行为(不使用任何选项)
[root@yyzcdb81 ~]# echo "Welcome to Haopython \nblog"
Welcome to Haopython \nblog
[root@yyzcdb81 ~]#
# 使用 -E 选项(效果相同)
[root@yyzcdb81 ~]# echo -E "Welcome to Haopython \nblog"
Welcome to Haopython \nblog
[root@yyzcdb81 ~]#
# 使用 -e 选项(启用转义)
[root@yyzcdb81 ~]# echo -e "Welcome to Haopython \nblog"
Welcome to Haopython
blog
[root@yyzcdb81 ~]#
13. 转义特定的特殊字符
当需要转义某个特定的特殊字符时,在该字符前添加 双反斜杠(\\):
# 正常情况:所有\n都会换行
[root@yyzcdb81 ~]# echo -e "Hello world\nHello World\nHello World"
Hello world
Hello World
Hello World
[root@yyzcdb81 ~]#
# 转义第三个\n,使其成为普通字符串
[root@yyzcdb81 ~]# echo -e "Hello world\nHello World\\\nHello World"
Hello world
Hello World\nHello World
[root@yyzcdb81 ~]#
14. echo vs printf
printf 是 echo 的替代方案,当需要更复杂的格式化输出时使用:
| 特性 |
echo |
printf |
| 易用性 |
✅ 简单直接 |
需要格式字符串 |
| 格式化能力 |
有限 |
✅ 强大 |
| 跨平台兼容性 |
略有差异 |
✅ 行为一致 |
| 换行符 |
默认自带 |
需要显式添加 \n |
# echo(简单场景)
[root@yyzcdb81 ~]# echo "Hello World"
Hello World
[root@yyzcdb81 ~]#
# printf(格式化输出)
[root@yyzcdb81 ~]# printf "Name: %s\nAge: %d\n" "Alice" 25
Name: Alice
Age: 25
[root@yyzcdb81 ~]#
建议: 日常简单输出使用 echo,需要复杂格式化时使用 printf。
15. 小结
| 知识点 |
要点总结 |
| 命令类型 |
type -a 命令 查看命令位置 |
| 基本用法 |
echo "文本" |
| 抑制换行 |
-n 选项 |
| 启用转义 |
-e 选项(\n、\t、\v、\c、\r 等) |
| 转义特定字符 |
使用双反斜杠 \\ |
| 变量扩展 |
双引号允许扩展,单引号禁止扩展 |
| 重定向 |
> 覆盖,>> 追加 |
| 管道 |
echo "text" | 其他命令 |
如果你对 Bash 脚本编程感兴趣,欢迎访问 云栈社区 获取更多技术实践与交流机会。