💜 想真正擅长编程? 从一门课程开始,100% 免费

第3节:输入输出与重定向

一、echo 与 printf 输出

1. echo 命令

echo 是最常用的输出命令。

Shell
echo "Hello World"
echo "当前目录为:$(pwd)"
echo -e "第一行\n第二行"   # -e 使转义字符生效

常用选项:

选项 说明
-n 不换行输出
-e 解析转义符,如\n
、\t

示例:

Shell
echo -n "请输入用户名: "

2. printf 命令

printf 格式更灵活,适用于需要对齐或格式化的输出。

语法:

Shell
printf "格式" 参数1 参数2 ...

示例:

Shell
printf "姓名: %s\t 年龄: %d\n" "张三" 25
printf "%-10s %-5s\n" 姓名 年龄
printf "%-10s %-5s\n" 张三 25
printf "%-10s %-5s\n" 李四 30

输出:

plain
姓名: 张三     年龄: 25
姓名       年龄
张三       25
李四       30

💡 总结:

  • echo 适合简单输出;
  • printf 适合对齐、格式化输出。

二、read 获取用户输入

read 用于从键盘读取输入。

Shell
read name
echo "你好,$name"

可指定提示文本与变量名:

Shell
read -p "请输入用户名:" user
read -s -p "请输入密码:" pass
echo -e "\n用户名:$user,密码:$pass"

选项说明:

选项 说明
-p 指定提示文本
-s 隐藏输入内容(如密码)
-t 设置超时时间(秒)

三、重定向符号

Shell 中的输入输出默认指向 终端(标准输入/输出)。 通过重定向符,可以将输出或输入改为文件。

符号 功能
> 输出覆盖写入文件
>> 输出追加写入文件
< 从文件读取输入

示例:

Shell
echo "日志测试" > log.txt     # 覆盖写入
echo "第二行" >> log.txt      # 追加写入
cat < log.txt                 # 从文件读取输入并输出

查看文件内容:

Shell
cat log.txt

四、管道符 |

管道将一个命令的输出作为另一个命令的输入。 常用于数据过滤、统计、日志分析等。

示例:

Shell
cat /var/log/syslog | grep error
ps -ef | grep nginx

组合使用:

Shell
dmesg | grep "usb" | wc -l

👉 含义:统计系统日志中包含 "usb" 的行数。


五、/dev/null 的用途

/dev/null 是一个“黑洞文件”,任何输出到它的数据都会被丢弃。 常用于:

  • 屏蔽命令输出;
  • 清空文件;
  • 忽略错误消息。

示例:

Shell
ls > /dev/null             # 丢弃标准输出
ls not_exist 2> /dev/null  # 丢弃错误输出
cat /dev/null > log.txt    # 清空文件

六、实战案例:统计日志文件中某个关键字出现次数

目标:统计 access.log 文件中 “ERROR” 出现的次数。

Shell
#!/bin/bash
# log_count.sh

read -p "请输入日志文件路径:" file
read -p "请输入要统计的关键字:" keyword

if [[ ! -f "$file" ]]; then
  echo "文件不存在!"
  exit 1
fi

count=$(grep -o "$keyword" "$file" | wc -l)
echo "关键字 '$keyword' 在文件中出现了 $count 次。"

运行:

Shell
bash log_count.sh

七、🧩 小练习:输入输出与重定向

编写脚本 io_demo.sh:

  1. 从用户输入姓名与年龄;
  2. 输出到屏幕;
  3. 同时将结果保存到 user_info.txt(追加写入)。

示例:

Shell
bash io_demo.sh

输出:

plain
请输入姓名:张三
请输入年龄:25
信息已保存:user_info.txt

文件内容:

plain
张三,25

八、🏁 课后作业

编写脚本 file_stat.sh,实现以下功能:

  1. 统计当前目录下的文件总数;
  2. 统计当前目录所有文件的总大小;
  3. 输出格式如下:
plain
当前目录:/home/user
文件总数:15
文件总大小:23.5M

提示:

Shell
count=$(ls -l | grep "^-" | wc -l)
size=$(du -sh . | cut -f1)