Shell 脚本教程 第 11 篇:Shell 中从键盘读取输入(read 命令)

在实际编写 Shell 脚本时,我们经常需要从用户处获取输入,最常用的方式就是使用 read 命令。本篇文章将深入讲解 read 的基本用法与进阶技巧,结合实际脚本场景,帮助你掌握这一核心交互手段。


一、read 命令基础语法

read [选项] 变量名
  • 变量名:用于存储用户输入的数据。

  • 选项常见:

    • -p:指定提示信息(prompt)
    • -t:设置等待输入的时间(timeout)
    • -n:只读取指定个数的字符
    • -s:静默模式(常用于密码)
    • -r:禁止反斜杠转义(默认会解析)
    • -a:把输入内容作为数组保存

**注意:**如果不写任何参数,也不指定变量名,read 会从终端读取一行输入,并将这一行内容自动保存到内置变量 REPLY 中,使用的时候直接调用 REPLY 即可,不推荐这样写,因为,当使用两次 read 而没有变量名,那么后一个变量的赋值会把前一个覆盖掉

二、基本使用示例

1. 不写参数和变量名

#!/bin/bash
echo -n "请输入你的名字:"
read
echo "你好,$REPLY!"

2. 读取单个输入和多个输入

#!/bin/bash
#读取单个输入
echo -n "请输入你的名字:"
read name
echo "你好,$name!"

#读取多个输入
echo -n "请输入性别、年龄和城市(空格分隔):" 
read gender age city
echo "性别:$gender"
echo "年龄:$age"
echo "城市:$city"

3. 带提示信息的读取 -p

read -p "输入你的年龄:" age
echo "你输入的年龄是:$age"

4. 设置读取超时时间 -t

-t -p的组合用法

read -t 5 -p "5秒内输入你的名字:" name

if [ -z "$name" ]; then
    echo "超时未输入,默认用户名:guest"
    name="guest"
else
    echo "你好:$name"
fi

5. 读取指定字符数 -n

read -n 1 -p "是否继续?(y/n):" choice
echo
if [ "$choice" == "y" ]; then
    echo "继续操作..."
else
    echo "已取消"
fi

6. 静默输入(适合密码) -s

read -s -p "请输入密码:" passwd
echo
echo "你输入的密码是:$passwd"

7. 阻止转义符解析 -r

read -p "请输入一段包含反斜杠的路径:(转义)" path
echo "你输入的是:$path"

read -r -p "请输入一段包含反斜杠的路径:(未转义)" paths
echo "你输入的是:$paths"

8. 把输入内容作为数组保存 -a

read -a names -p "请输入几个名字,用空格分隔: "
echo "你输入了 ${#names[@]} 个名字"
for name in "${names[@]}"; do
  echo "  名字: $name"
done

9. 与循环结合,菜单选择

while true; do
    echo "请选择操作:"
    echo "1. 查看当前目录"
    echo "2. 显示当前目录下文件"
    echo "3. 退出"
    read -p "请输入编号 [1-3]:" opt
    case $opt in
        1) pwd;;
        2) ll;;
        3) echo "再见!"; break;;
        *) echo "无效选择,请重新输入。";;
    esac
    echo
done


二、 脚本:read 的所有用法

#!/bin/bash

echo "=== read 命令参数演示 ==="

# -p: 提示信息
read -p "请输入你的名字: " name
echo "你好, $name"
echo "---------------------------"

# -t: 超时设置(5秒内不输入就跳过)
echo "你有20秒钟时间输入一个爱好(否则将跳过)..."
if read -t 20 -p "> " hobby; then
  echo "你的爱好是: $hobby"
else
  echo "超时,未输入爱好。"
fi
echo "---------------------------"

# -n: 只读取指定数量的字符(比如只读前3个字符)
read -n 3 -p "请输入任意内容(只会读前3个字符): " short_input
echo -e "\n你输入的前3个字符是: '$short_input'"
echo "---------------------------"

# -s: 静默输入(常用于密码)
read -s -p "请输入密码(不会显示): " password
echo "你输入的密码是:$password"
echo -e "\n密码已输入(长度为${#password})"

# 清空输入缓冲区
while IFS= read -r -t 0.1 -n 1; do : ; done
echo "---------------------------"

# -r: 不转义反斜杠(测试路径)
read -r -p "请输入一个包含反斜杠的路径(如 C:\test\file): " path
echo "你输入的路径是: $path"
echo "---------------------------"

# -a + -r + -p: 输入多个值存入数组,并保留反斜杠
read -ra fruits -r -p "请输入几种水果,用空格分隔(支持带反斜杠的名称): " 
echo "你输入了 ${#fruits[@]} 种水果:"
for fruit in "${fruits[@]}"; do
  echo "  - $fruit"
done
echo "---------------------------"

# 综合使用:-s -r -t(限时输入密码)
echo "请在10秒内输入确认码(静默输入,禁止转义)..."
if read -srt 10 confirm_code; then
  echo -e "\n确认码为: $confirm_code"
else
  echo -e "\n超时或未输入确认码。"
fi

echo "=== 脚本结束 ==="

小结

场景命令示例
普通输入read name
多变量read name city
带提示read -p "提示" var
输入超时read -t 5 var
静默输入read -s var
指定字符数读取read -n 1 var
防转义read -r var

read 是实现交互式 Shell 脚本的关键工具。掌握它的多种用法,能够让你写出更智能、友好的脚本程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安全日记pro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值