介绍
安装某些软件时,中间会停下来,等待我们输入参数,这种功能就是获取控制台输入
read 命令,用于 从标准输入读取用户输入或文件内容 的核心命令,是实现交互式脚本的关键工具。
常见用法
1. 基本读取(读取单行输入)
#!/bin/bash
# 读取用户输入并存储到变量中
echo "请输入你的名字:"
read name
echo "你好,$name!"
运行效果:
请输入你的名字:
Alice
你好,Alice!
2. 直接提示(结合 -p 选项)
用 -p 直接在读取前显示提示信息,无需单独 echo:
#!/bin/bash
# -p:prompt(提示)
read -p "请输入你的年龄:" age
echo "你的年龄是:$age 岁"
运行效果:
请输入你的年龄:25
你的年龄是:25 岁
例子
#!/bin/bash
read -p "请输入第一个数字:" x
read -p "请输入第二个数字:" y
res=$(($x+$y))
echo "加法结果:$res"
常用选项
1. -n:读取指定长度的字符
限制读取的字符数量,无需按回车:
#!/bin/bash
# -n 1:只读取1个字符
read -n 1 -p "请按Y/N确认:" confirm
echo -e "\n你选择了:$confirm"
运行效果:
请按Y/N确认:Y
你选择了:Y
2. -s:静默读取(隐藏输入,适合密码)
输入内容不显示在终端,用于读取密码或敏感信息:
#!/bin/bash
# -s:silent(静默)
read -s -p "请输入密码:" password
echo -e "\n密码已输入,长度为:${#password}"
运行效果:
请输入密码:
密码已输入,长度为:6
3. -t:设置超时时间
指定读取的超时秒数,超时后自动退出:
#!/bin/bash
# -t 5:5秒超时
if read -t 5 -p "请在5秒内输入内容:" input; then
echo "你输入的是:$input"
else
echo -e "\n超时未输入!"
fi
运行效果(超时):
请在5秒内输入内容:
超时未输入!
4. -d:指定分隔符(默认是换行)
用指定字符作为输入结束的标志,而非回车:
#!/bin/bash
# -d ";":以分号作为结束符
read -d ";" -p "输入内容(以;结束):" content
echo "你输入的内容是:$content"
运行效果:
输入内容(以;结束):Hello World;
你输入的内容是:Hello World
高级用法
1. 读取多个变量
一次性读取多个值,自动按空格/制表符分隔:
#!/bin/bash
read -p "请输入姓名和年龄(空格分隔):" name age
echo "姓名:$name,年龄:$age"
运行效果:
请输入姓名和年龄(空格分隔):Bob 30
姓名:Bob,年龄:30
2. 读取文件内容(逐行读取)
结合循环逐行读取文件内容:
#!/bin/bash
# 逐行读取文件
echo "读取文件内容:"
while read line; do
echo "行内容:$line"
done < "test.txt" # 重定向文件到read
test.txt 内容:
第一行
第二行
第三行
运行效果:
读取文件内容:
行内容:第一行
行内容:第二行
行内容:第三行
3. 读取数组(将输入转为数组)
用 -a 将输入内容按分隔符存入数组:
#!/bin/bash
# -a:array(数组)
read -a fruits -p "输入水果名称(空格分隔):"
echo "你输入的水果有:${fruits[@]}"
echo "第一个水果:${fruits[0]}"
运行效果:
输入水果名称(空格分隔):苹果 香蕉 橙子
你输入的水果有:苹果 香蕉 橙子
第一个水果:苹果
注意事项
- 输入分隔符:默认以空格、制表符或换行作为分隔符,读取多个变量时会自动分配。
- 换行处理:
read默认会忽略末尾的换行符,读取的内容不包含换行。 - 空输入处理:如果直接按回车,变量会被设为空字符串,可通过
if [ -z "$var" ]判断。 - 重定向输入:除了读取用户输入,还可通过
< 文件读取文件内容。
总结
- 核心功能:
read是 Shell 实现交互式输入的核心命令,支持读取用户输入、文件内容等。 - 常用选项:
-p(提示)、-s(静默)、-t(超时)、-n(长度限制)是最实用的选项。 - 扩展用法:可读取多个变量、数组,或结合循环逐行读取文件,满足复杂脚本需求。