今天深入学习了 Shell 脚本中三个核心命令:read、printf 和 test。它们是让脚本从“能跑”到“好用”的关键,我把课堂笔记和实战心得整理成这篇博客,和大家一起巩固学习。
一、read:让脚本和用户“聊起来”
1.read 是实现脚本交互的基础,它能读取用户输入并保存到变量中。
基础语法:read [-options] [variables]
• options表示选项,如下表所示;variables表示用来存储数据的变量,可以有一个,也可以有多个。
• options和variables都是可选的,如果没有提供变量名,那么读取的数据将存放到环境变量 REPLY 中。
2.read命令支持的选项
| 选项 | 说明 |
| -a array | 把读取的数据赋值给数组array,从下标0开始。 |
| -d delimiter | 用字符串delimiter指定读取结束的位置,而不是一个换行符(读取到的数据不包括delimiter)。 |
| -e | 在获取用户输入的时候,对功能键进行编码转换,不会直接显示g功能键对应的字符。 |
| -n num | 读取num个字符,而不是整行字。 |
| -p prompt | 显示提示信息,提示内容为prompt。 |
| -r | 原样读取(Raw mode),不把反斜杠字符解释为转义字符。 |
| -s | 静默模式(Slient mode),不会在屏幕上显示输入内容。当输入密码和其他确认信息的时候,这是很有必要的。 |
| -t seconds | 设置超时时间,单位为秒。如果用户没有在指定时间内输入完成,那么read将会返回一个非0的状态,表示读取失效。 |
| -u fd | 使用文件描述fd作为输入源,而不是标准输入,类似于重定向。 |
课堂实战:超时密码验证
#!/bin/bash
if read -t 20 -sp "Enter password in 20 seconds(once): " pass1 && printf "\\n" &&
read -t 20 -sp "Enter password in 20 seconds(again): " pass2 && printf "\\n"; then
if [ "$pass1" == "$pass2" ]; then
echo "Valid password"
else
echo "Invalid password"
fi
else
echo -e "\\nInput timeout!"
fi
这个例子里,&& 串联了多个命令,只要其中一个失败,后续命令就不会执行,非常适合做条件判断。
二、printf:让输出更“规整”
比起 echo,printf 支持丰富的格式化功能,是生成清晰报表和日志的首选。
基础语法
printf format-string [arguments…]
核心格式化规则
• %s:输出字符串
• %d:输出整数
• %f:输出浮点数(%4.2f 表示保留2位小数)
• %-10s:左对齐并占用10字符宽度,不足用空格填充
课堂实战:生成人员信息表
printf "%-10s %-8s %-4s\\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\\n" 郭芙 女 47.9876
执行后会输出一个对齐工整的表格,可读性比 echo 高很多。
三、test:脚本的“逻辑大脑”
test 命令(或等价的 [ ] 语法)用来判断条件是否成立,支持数值、字符串和文件三类测试。
1. 数值测试
参数 说明
-eq 等于为真
-ne 不等于为真
-gt 大于为真
-ge 大于等于为真
-lt 小于为真
-le 小于等于为真
2. 字符串测试
• =:字符串相等
• !=:字符串不等
• -z:字符串为空
• -n:字符串非空
3. 文件测试
• -e:文件存在
• -f:普通文件
• -d:目录
• -r/-w/-x:文件可读/可写/可执行
课堂实战:文件存在性判断
cd /bin
if test -e ./bash; then
echo "文件已存在!"
else
echo "文件不存在!"
fi
还可以用逻辑操作符 -a(与)、-o(或)、!(非)来组合条件,比如:
if test -e ./notFile -o -e ./bash; then
echo "至少有一个文件存在!"
fi
总结:脚本进阶的“三板斧”
这三个命令各有侧重,组合起来能让你的脚本更强大:
• read 负责输入交互,让脚本更懂用户
• printf 负责输出美化,让结果更易阅读
• test 负责逻辑判断,让脚本更会思考



