linux shell 编程:read获取控制台输入、读取文件内容

介绍

安装某些软件时,中间会停下来,等待我们输入参数,这种功能就是获取控制台输入

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]}"

运行效果:

输入水果名称(空格分隔):苹果 香蕉 橙子
你输入的水果有:苹果 香蕉 橙子
第一个水果:苹果

注意事项

  1. 输入分隔符:默认以空格、制表符或换行作为分隔符,读取多个变量时会自动分配。
  2. 换行处理:read 默认会忽略末尾的换行符,读取的内容不包含换行。
  3. 空输入处理:如果直接按回车,变量会被设为空字符串,可通过 if [ -z "$var" ] 判断。
  4. 重定向输入:除了读取用户输入,还可通过 < 文件 读取文件内容。

总结

  1. 核心功能:read 是 Shell 实现交互式输入的核心命令,支持读取用户输入、文件内容等。
  2. 常用选项:-p(提示)、-s(静默)、-t(超时)、-n(长度限制)是最实用的选项。
  3. 扩展用法:可读取多个变量、数组,或结合循环逐行读取文件,满足复杂脚本需求。

原文出处:/show_1GW2GD3dyG56.html