0%

输出命令

Linux 输出命令详解:echo 与 printf 的使用技巧

在 Linux 命令行中,echoprintf 是用于输出文本或变量内容的核心工具。它们在脚本编写、日志输出和交互提示中频繁使用,掌握两者的区别和用法能显著提升命令行效率。本文将详细解析这两个命令的功能、选项及实战示例。

echo:简单高效的输出命令

echo 是最基础的输出命令,语法简单,默认自动换行,适合快速输出文本、变量或命令结果。

基本用法

1
echo [选项] 输出内容
(1)输出普通文本
1
2
3
4
5
6
7
# 输出字符串(无需引号,空格需用引号包裹)
echo Hello World
# 输出:Hello World

# 输出带空格的字符串(单引号或双引号均可)
echo "Hello, Linux World"
# 输出:Hello, Linux World
(2)输出变量

echo 可直接解析变量值(变量名前加 $):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 定义变量
name="Alice"
age=25

# 输出单个变量
echo $name
# 输出:Alice

# 输出多个变量(可拼接文本)
echo "Name: $name, Age: $age"
# 输出:Name: Alice, Age: 25

# 用 ${} 明确变量边界(避免与其他字符混淆)
echo "Today is ${name}sday" # 若直接写 $namesday 会被误认为变量 namesday
# 输出:Today is Alicesday
(3)输出命令执行结果

通过反引号 `` 或$()嵌套命令,echo` 可输出命令的执行结果:

1
2
3
4
5
# 输出当前日期(使用反引号)
echo "Today is `date +%Y-%m-%d`"

# 输出当前目录下的文件数(使用 $())
echo "File count: $(ls | wc -l)"

常用选项

  • -n省略结尾的换行符(默认自动换行)。

    1
    2
    3
    echo -n "Hello"
    echo " World" # 与上一行输出在同一行
    # 输出:Hello World
  • -e解析转义字符(如换行 \n、制表符 \t 等)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    # 输出换行
    echo -e "Line 1\nLine 2"
    # 输出:
    # Line 1
    # Line 2

    # 输出制表符(对齐效果)
    echo -e "Name\tAge"
    echo -e "Alice\t25"
    # 输出:
    # Name Age
    # Alice 25

printf:格式化输出命令

printf 源自 C 语言的 printf 函数,支持复杂的格式化输出,默认不自动换行,需显式添加换行符 \n。适合需要精确控制输出格式的场景(如表格、对齐文本)。

基本语法

1
printf "格式字符串" [参数1 参数2 ...]
  • 格式字符串:包含普通文本和占位符(如 %s 字符串、%d 整数),需用引号包裹。
  • 参数:与占位符一一对应的变量或值,多个参数用空格分隔。

常用占位符

占位符 功能描述 示例
%s 输出字符串(默认右对齐) printf "Name: %s" "Bob"
%d 输出整数 printf "Age: %d" 30
%f 输出浮点数(默认保留 6 位小数) printf "Score: %f" 95.5
%10s 字符串占 10 个字符宽度(右对齐) printf "%10s" "Hello"
%-10s 字符串占 10 个字符宽度(左对齐) printf "%-10s" "Hello"
\n 换行符(需显式添加) printf "Hello\n"

实战示例

(1)基础格式化输出
1
2
3
4
5
6
7
# 输出字符串和整数
printf "Name: %s, Age: %d\n" "Bob" 30
# 输出:Name: Bob, Age: 30

# 输出浮点数(保留2位小数)
printf "Price: %.2f\n" 99.9 # .2 表示保留2位小数
# 输出:Price: 99.90
(2)对齐输出(表格形式)
1
2
3
4
5
6
7
8
# 左对齐(%-10s)和右对齐(%10s)
printf "%-10s %10s %10s\n" "Name" "Age" "Score"
printf "%-10s %10d %10.1f\n" "Alice" 25 98.5
printf "%-10s %10d %10.1f\n" "Bob" 30 89.0
# 输出:
# Name Age Score
# Alice 25 98.5
# Bob 30 89.0
(3)多参数循环输出

若参数数量多于占位符,printf 会循环使用格式字符串:

1
2
3
4
printf "Name: %s, Age: %d\n" "Alice" 25 "Bob" 30
# 输出:
# Name: Alice, Age: 25
# Name: Bob, Age: 30

echo 与 printf 的核心区别

特性 echo printf
自动换行 默认自动换行(可通过 -n 取消) 默认不换行(需显式添加 \n
格式化能力 弱(仅支持 -e 解析转义字符) 强(支持占位符、对齐、精度控制等)
兼容性 不同 Shell 实现略有差异(如 bashsh 跨 Shell 兼容性更好(行为更统一)
适用场景 简单输出、变量打印、快速调试 复杂格式化(表格、日志、报表)

实战技巧

  1. 脚本中的进度提示(用 echo -n 实现不换行更新):

    1
    2
    3
    4
    5
    echo -n "Processing..."
    # 模拟耗时操作
    sleep 2
    echo " Done"
    # 输出:Processing... Done
  2. 生成格式化日志(用 printf 统一格式):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 日志格式:[时间] [级别] 消息
    log() {
    local level=$1
    local message=$2
    printf "[%s] [%s] %s\n" "$(date +%Y-%m-%d %H:%M:%S)" "$level" "$message"
    }
    log "INFO" "System started"
    log "ERROR" "File not found"
    # 输出:
    # [2023-10-01 12:00:00] [INFO] System started
    # [2023-10-01 12:00:05] [ERROR] File not found
  3. 处理特殊字符echo -e 解析转义,printf 直接支持):

    1
    2
    3
    4
    5
    6
    # 输出引号和反斜杠
    echo -e "He said \"Hello\\\World\"" # \ 转义 " 和 \
    # 输出:He said "Hello\World"

    printf "He said \"Hello\\\World\"\n"
    # 输出:He said "Hello\World"

欢迎关注我的其它发布渠道