一、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:
- 从用户输入姓名与年龄;
- 输出到屏幕;
- 同时将结果保存到
user_info.txt(追加写入)。
示例:
Shell
bash io_demo.sh
输出:
plain
请输入姓名:张三
请输入年龄:25
信息已保存:user_info.txt
文件内容:
plain
张三,25
八、🏁 课后作业
编写脚本 file_stat.sh,实现以下功能:
- 统计当前目录下的文件总数;
- 统计当前目录所有文件的总大小;
- 输出格式如下:
plain
当前目录:/home/user
文件总数:15
文件总大小:23.5M
提示:
Shell
count=$(ls -l | grep "^-" | wc -l)
size=$(du -sh . | cut -f1)