echo 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
echo——shell 内置命令,几乎每个脚本都会用到。它简单,但引号规则和转义坑不少。
echo 把后面跟的参数输出到标准输出(屏幕/管道)。它是 shell 脚本里"打印提示、输出变量、拼字符串"的基础工具。看似 trivial,但单引号/双引号的区别、转义符的处理,新手很容易踩。
一、基本输出与引号
echo hello world # 输出:hello world
echo "hello world" # 同上,引号防分词
echo 'hello $USER' # 单引号:原样输出,变量不展开
echo "hello $USER" # 双引号:变量展开(输出 hello chzhuo)引号区别是核心:单引号里一切原样(变量、反引号、转义都不生效);双引号里变量会展开、但空白被保留;不加引号则变量展开且按空白分词。
echo '$HOME'打印字面$HOME,echo "$HOME"打印真实家目录——这个差异贯穿整个 shell 编程。
二、不换行与转义:-n / -e
echo -n "请输入: " # -n 末尾不换行(做交互提示)
echo -e "line1\nline2" # -e 解析转义:\n 换行 \t 制表
echo -e "\e[31m红色\e[0m" # 输出带 ANSI 颜色(终端里变红)
-n让输出后不换行,做"请输入:"这类提示时用。-e开启转义解析,\n换行、\t制表、\e[31m是 ANSI 颜色码。注意:不同 shell(bash 内置 echo 与 /bin/echo)对-e/-n支持略有差异,跨平台脚本要当心——这正是 printf 更可靠的原因。
三、命令替换配合
echo "当前用户: $(whoami)" # $(...) 命令替换,嵌命令输出
echo "文件数: $(ls | wc -l)" # 见 [wc](/linux/cmd/wc.md)
echo "今天: $(date +%F)"
$(命令)把命令的输出嵌进字符串,是 shell 里组合信息的常用手法。配合 date/whoami/wc 等拼出动态提示或日志行。注意$(...)比老式反引号`...`更推荐(嵌套清晰、可读好)。
四、echo vs printf
echo "值: $var"
printf "值: %s\n" "$var" # 更可控、行为一致
printf "%-10s %d\n" "name" 42 # 格式化对齐
echo行为在不同系统/ shell 间有差异(尤其-e/转义),写可移植脚本时 printf 更稳——格式字符串明确、跨平台一致。echo适合随手打印,printf 适合需要精确格式(对齐、数值、转义)的场景。本站 现代工具 里也提到这点。
五、实战:脚本里的提示与日志
#!/bin/bash
echo "开始备份..."
tar -czf /backup/www-$(date +%F).tar.gz /var/www
echo "备份完成: $?"
# 带颜色的成功/失败提示
echo -e "\e[32m[OK]\e[0m 备份成功"
echo -e "\e[31m[FAIL]\e[0m 备份失败"脚本里用 echo 打印步骤进度、
$?(上条命令退出码)反馈结果、ANSI 颜色区分成功失败。简单脚本够用;复杂日志建议用logger写进系统日志(配合 systemd journal)而非只 echo 到 stdout。
一句话总结
echo = 输出字符串/变量:单引号原样、双引号展开变量、无引号分词;-n 不换行、-e 解析转义(\n/\t/ANSI 色);配合 $(命令) 嵌输出拼动态信息。注意不同 shell 的 echo 行为差异,可移植脚本改用 printf;简单打印/提示用 echo 足矣。