Shell echo 命令详解(新手详细版)
本文档面向零基础新手,从“echo 是干什么的”讲起,详细说明基本用法、选项、转义序列、引号影响、与 printf 的对比、常见用法等,并配有大量示例。
一、echo 是什么?
1.1 一句话理解
echo 用来把一段文字(或变量的值)输出到标准输出,也就是默认显示在终端上。
输出完后,echo 会在末尾自动换行(除非用 -n 选项取消)。
- 可以输出字面字符串、变量、混合;
- 常用来:提示信息、调试打印、配合重定向写入文件、在管道里给下一条命令提供输入。
1.2 基本语法
echo [选项] [要输出的内容...]
- 要输出的内容:可以没有(只输出一个空行)、一个字符串、多个用空格分隔的“参数”(都会连在一起输出,中间用空格隔开)。
- 多个参数时,echo 会在它们之间自动加空格,最后加一个换行。
二、基本用法示例
2.1 输出一段固定文字
echo "你好,世界"
# 你好,世界
echo hello
# hello
2.2 输出变量的值
变量要用 $变量名 或 ${变量名},Shell 会先展开变量再交给 echo:
name="张三"
echo "你好,$name"
# 你好,张三
echo $name
# 张三
2.3 输出多个“参数”(中间会加空格)
echo 第一 第二 第三
# 第一 第二 第三
echo "a" "b" "c"
# a b c
2.4 不跟任何参数
echo
# 输出一个空行(只换行)
2.5 输出重定向到文件
echo 的输出可以像普通命令一样重定向:
echo "第一行" > file.txt
echo "第二行" >> file.txt
cat file.txt
# 第一行
# 第二行
三、常用选项
3.1 -n:不换行
默认 echo 会在末尾换行;-n 表示不要这个换行,下一次输出会紧接在同一行后面。
echo -n "请输入名字: "
read name
# 提示和输入会在同一行
echo -n "a"
echo -n "b"
echo "c"
# abc(前两个不换行,最后一个换行)
注意:少数系统上 echo -n 可能被当成字面输出 “-n”(见后文“可移植性”);Bash 里一般没问题。
3.2 -e:启用反斜杠转义(Bash)
不加 -e 时,n、t 等会原样打印成两个字符;加上 -e 后,反斜杠转义会被解释成换行、制表符等。
echo "第一行n第二行"
# 第一行n第二行(字面)
echo -e "第一行n第二行"
# 第一行
# 第二行
3.3 -E:禁用转义(Bash,一般用不到)
-E 明确表示“不解释转义”,这是很多 Shell 的默认行为;写不写 -E 效果常一样。
echo -E "anb"
# anb
四、转义序列(需 -e,Bash)
在 echo -e 里,以下反斜杠组合会被解释成特殊含义:
| 写法 | 含义 |
|---|---|
| n | 换行 |
| t | 制表符(Tab) |
| r | 回车 |
| b | 退格 |
| a | 响铃(终端可能哔一声) |
| \ | 一个反斜杠 |
| �nnn | 八进制 nnn 对应的字符(0 到 3 位) |
| xHH | 十六进制 HH 对应的字符 |
| c | 不换行并结束输出(部分实现) |
示例:
echo -e "姓名t年龄n张三t25"
# 姓名 年龄
# 张三 25
echo -e "第一行n第二行n第三行"
# 第一行
# 第二行
# 第三行
echo -e "hellobworld"
# hellworld(b 退格擦掉一个 o,视终端而定)
echo -e "结束c"
# 结束(不换行,部分 Shell)
注意:-e 不是 POSIX 标准,在 sh 或某些系统上可能无效;需要可移植时可用 printf(见后文)。
五、引号对输出的影响
5.1 不加引号
- 变量会展开;
- 多个连续空格可能被 Shell 合并成一个;
- 通配符 *、? 可能被展开成文件名。
echo hello world
# hello world(多个空格变一个)
x="*"
echo $x
# 可能列出当前目录文件名(* 被展开)
5.2 双引号 “…”
- 变量 $var、命令替换 $(cmd) 会展开;
- 空格、多数特殊字符保留;
- 若要输出字面 $、“、 等,需转义 、“ 等。
name="李四"
echo "你好,$name"
# 你好,李四
echo "价格: $100"
# 价格: $100
5.3 单引号 ‘…’
- 什么都不展开,全部当字面字符;$name 就是五个字符,不是变量值。
echo '你好,$name'
# 你好,$name
echo '第一行n第二行'
# 第一行n第二行(没有换行,就是 n 两个字符)
5.4 小结
| 写法 | 变量/命令替换 | 转义 n t 等 | 适用场景 |
|---|---|---|---|
| 无引号 | 展开 | 不解释(字面) | 简单无空格、无特殊字符 |
| 双引号 | 展开 | 不解释(除非 echo -e) | 需要变量、保留空格 |
| 单引号 | 不展开 | 不解释 | 要原样输出 $、 等 |
六、常见输出内容示例
6.1 纯文字
echo "程序开始"
echo 错误:文件不存在
6.2 变量 + 文字
count=5
echo "共 $count 个文件"
# 共 5 个文件
echo "当前用户: $USER"
6.3 多行(用 n,需 -e)
echo -e "第一行n第二行n第三行"
6.4 制表符对齐(用 t,需 -e)
echo -e "姓名t分数n张三t90n李四t85"
6.5 输出到标准错误(脚本里提示、错误信息)
echo 默认输出到标准输出;若希望输出到标准错误(例如错误提示),可重定向:
echo "错误信息" >&2
# 或
echo "错误信息" 1>&2
这样在“只重定向标准输出”时,错误提示仍会显示在终端。
6.6 空行
echo
# 或
echo ""
七、echo 与 printf 的简单对比
| 特性 | echo | printf |
|---|---|---|
| 末尾换行 | 默认有,-n 可去掉 | 没有,需自己写 n |
| 转义 | 需 -e(非标准) | 默认解释 n、t 等 |
| 格式控制 | 无 | 有 %s、%d、%f 等 |
| 可移植性 | -e、-n 各系统不一 | POSIX 标准,更统一 |
示例对比:
# 多行
echo -e "anbnc"
printf "%sn" "a" "b" "c"
# 或
printf "anbncn"
# 不换行
echo -n "请输入: "
printf "请输入: "
# 格式化(只能用 printf)
printf "%-10s %5dn" "张三" 90 "李四" 85
建议:简单提示、单行输出用 echo 即可;需要不换行、转义、格式化、可移植时,用 printf 更稳妥。
八、可移植性说明(了解即可)
- echo 在不同 Shell、不同系统上行为不完全一致:
- 有的 echo -n 不换行,有的会输出字面 “-n”;
- 有的默认就解释 n,有的必须 echo -e。
- POSIX 只规定 echo 输出“参数 + 换行”,不规定 -n、-e。
- 写脚本时若希望在各处都能跑,避免依赖 echo -e、echo -n,改用 printf 更安全。
- 若脚本明确用 #!/bin/bash,在 Linux 上 echo -e、echo -n 一般可用。