一、read命令基础
1.1 基本用法
#!/bin/bash
# read_demo.sh
# 1. 读取单个变量
read variable
echo "你输入的是: $variable"
# 2. 读取多个变量(空格分隔)
read name age city
echo "姓名: $name, 年龄: $age, 城市: $city"
# 3. 使用-p提示信息
read -p "请输入用户名: " username
echo "用户名: $username"
# 4. 省略变量名(存入REPLY)
read -p "请输入任意内容: "
echo "你输入的是: $REPLY"
# 5. 同时读取并显示提示
read -p "姓名 年龄 城市: " name age city
1.2 执行示例
# 执行
./read_demo.sh
# 输入:
Tom 25 Beijing
# 输出:
姓名: Tom, 年龄: 25, 城市: Beijing
二、read与引号结合
2.1 双引号 " " – 解析变量
#!/bin/bash
# 双引号示例
name="张三"
read -p "请输入你的年龄: " age
# 双引号内$age会被解析
result="用户 $name 的年龄是 $age"
echo $result
# 输入: 30
# 输出: 用户 张三 的年龄是 30
2.2 单引号 ' ' – 禁止解析
#!/bin/bash
# 单引号示例
name="张三"
read -p "请输入你的年龄: " age
# 单引号内$age不会被解析
result='用户 $name 的年龄是 $age'
echo $result
# 输入: 30
# 输出: 用户 $name 的年龄是 $age(原样输出)
2.3 反引号 ` ` – 命令替换
#!/bin/bash
# 反引号示例
read -p "请输入文件名: " filename
# 反引号执行命令
content=`cat $filename 2>/dev/null`
echo "文件内容: $content"
# 或者用$()(推荐)
content=$(cat $filename 2>/dev/null)
echo "文件内容: $content"
三、综合示例
#!/bin/bash
# read_quotes_demo.sh
echo "========== read命令与引号综合示例 =========="
# 1. 基础read
read -p "输入你的名字: " name
echo "你好, $name"
# 2. 双引号使用
read -p "输入你的年龄: " age
message="你的名字是 $name, 年龄 $age"
echo "$message"
# 3. 单引号使用
read -p "输入一个表达式: " expr
literal='你输入的表达式是: $expr'
echo "$literal"
# 4. 反引号使用
read -p "输入要查询的命令: " cmd
echo "命令 $cmd 的路径是:"
which $cmd
# 5. 混合使用
read -p "输入用户名和密码(空格分隔): " user pass
echo "用户名: $user"
echo "密码长度: ${#pass}"
# 6. 读取到数组
read -p "输入多个值(空格分隔): " -a array
echo "第一个: ${array[0]}"
echo "第二个: ${array[1]}"
echo "所有: ${array[@]}"
# 7. 限制时间输入(3秒)
if read -t 3 -p "3秒内输入: " quick; then
echo "你输入了: $quick"
else
echo "超时了"
fi
# 8. 隐藏输入(如密码)
read -s -p "输入密码(不显示): " password
echo
echo "密码已输入,长度: ${#password}"
四、read常用选项
| 选项 | 作用 | 示例 |
|---|
-p | 提示信息 | read -p "请输入: " var |
-s | 静默模式(不显示输入) | read -s -p "密码: " pass |
-t | 超时时间(秒) | read -t 5 -p "5秒内输入: " var |
-n | 读取字符数 | read -n 3 -p "输入3个字符: " var |
-a | 读入数组 | read -a array |
-d | 分隔符 | read -d ':' var |
-r | 原始输入(不处理反斜杠) | read -r var |
五、实际应用场景
5.1 交互式脚本
#!/bin/bash
# install.sh
echo "=== 安装程序 ==="
read -p "安装路径 [/usr/local]: " prefix
prefix=${prefix:-/usr/local} # 默认值
read -p "是否创建符号链接? [y/n]: " confirm
if [ "$confirm" = "y" ]; then
echo "创建符号链接..."
fi
5.2 读取配置文件
#!/bin/bash
# 按分隔符读取
while IFS=: read user pass uid gid desc home shell; do
echo "用户: $user, Shell: $shell"
done < /etc/passwd | head -3
5.3 菜单选择
#!/bin/bash
while true; do
echo "1. 显示日期"
echo "2. 显示当前目录"
echo "3. 退出"
read -p "请选择 [1-3]: " choice
case $choice in
1) date ;;
2) pwd ;;
3) exit 0 ;;
*) echo "无效选择" ;;
esac
done
六、常见错误
# 错误1:read后面有管道(管道会创建子Shell)
echo "Tom" | read name # name在子Shell,外面拿不到
echo $name # 为空!
# 正确做法
name=$(echo "Tom")
# 错误2:忘记加引号
read -p 请输入姓名 name # 语法错误
read -p "请输入姓名: " name # 正确
# 错误3:空格分割问题
read name age # 输入"Tom 25"没问题
# 输入"Tom John 25"会出错(Tom给name,John给age,25被忽略)
七、总结
| 场景 | 推荐写法 |
|---|
| 简单输入 | read var |
| 带提示 | read -p "提示: " var |
| 密码输入 | read -s -p "密码: " pass |
| 超时控制 | read -t 5 var |
| 数组输入 | read -a array |
| 默认值 | var=${var:-默认值} |
read命令是Shell交互式脚本的基础,结合引号可以灵活处理用户输入!
发表回复