Linux Shell 脚本 read 命令完全指南 - 从用户输入到逐行读取文件的实战技巧

概述

本文介绍了在编写 Linux Bash Shell 脚本时,用于处理交互式用户输入和解析文本数据必不可少的 read 命令核心用法。内容涵盖从基础输入处理、密码隐藏(-s)、超时控制(-t)、分隔符切分(IFS),到实际工作中最为常用的基于 while 循环的文件逐行读取技术。

1. read 命令基础、提示符(-p)及默认值设置

运行 mkdir -p ~/read-demo && cd ~/read-demo 命令,创建用于 read 命令实践的专属目录并切换进入。

mkdir -p ~/read-demo && cd ~/read-demo

read 命令从标准输入读取一行并存入变量中,可以使用 -p 选项输出提示信息,并通过 ${变量名:-默认值} 语法在变量为空时代入默认值。
在执行结果中,由于未直接向 read 命令传递输入,username 变量保持为空,因此根据 ${username:-guest} 语法输出了默认值 guest。
⚙️ [主要选项]

-p : 指定在接收输入前显示在屏幕上的提示字符串。
-s : 启用密码等敏感信息输入时的静默模式,不在屏幕上回显输入字符。
-t : 设置输入等待超时时间(秒),超过指定时间则终止输入。
-n : 仅读取指定数量的字符,无需按回车键即可立即结束输入。
-r : 不将反斜杠(\)解析为转义字符,原样读取原始内容。
-a : 将输入的词按空格分割并按顺序存储到数组变量中。
-d : 自定义用于结束输入的定界符(delimiter),以替代默认的换行符。

bash -c ‘read -p “사용자 이름을 입력하세요: " username; echo “입력된 사용자: ${username:-guest}” «< “tester”’

2. 密码隐藏(-s)与输入超时限制(-t)处理

运行 cd ~/read-demo 命令切换到先前创建的 ~/read-demo 目录,以继续后续实践。

cd ~/read-demo

使用 -s 选项隐藏输入字符,并使用 -t 5 选项设置 5 秒超时限制来接收输入。
密码在超时时限内正常传递,退出状态码($?)输出为 0。

bash -c ‘read -t 5 -sp “비밀번호를 입력하세요 (5초 제한): " userpass; echo; echo “입력 완료 여부: $?” «< “secret1234”’

3. 利用分隔符(IFS)与 -a 选项进行多变量与数组分割

运行 cd ~/read-demo 命令切换到先前创建的 ~/read-demo 目录,以继续后续实践。

cd ~/read-demo

将内部字段分隔符(IFS)指定为逗号(,),然后使用 read 命令读取通过 Here-String(<<<)传递的 CSV 格式字符串,分别拆分存储到 col1、col2 和 col3 变量中。
执行结果显示,字符串中包含的服务器名称、IP 地址和服务名称已按照指定的分隔符正确拆分并输出到各变量中。

bash -c ‘IFS=”,” read -r col1 col2 col3 «< “server01,192.168.1.10,nginx”; echo “서버: $col1 | IP: $col2 | 서비스: $col3”’

将分隔符(IFS)设置为冒号(:),并结合 -a 选项,将 /etc/passwd 格式的字符串拆分并存储到 user_info 数组变量中。
数组索引为 0 的用户名(root)与索引为 6 的登录 Shell 路径(/bin/bash)被成功提取并打印。

bash -c ‘IFS=":" read -ra user_info «< “root:x:0:0:root:/root:/bin/bash”; echo “계정명: ${user_info[0]}, 셸: ${user_info[6]}”’

4. 实战核心:利用 while 循环与 read -r 逐行处理大文件

运行 cd ~/read-demo 命令切换到先前创建的 ~/read-demo 目录,以继续后续实践。

cd ~/read-demo

为了实践文件逐行处理,创建包含逗号分隔的服务器名称及运行状态的示例 CSV 文件 servers.csv。

echo -e “server-web,running\nserver-db,stopped\nserver-cache,running” > servers.csv

结合使用 while 循环和 read -r 命令,并将内部字段分隔符(IFS)指定为逗号(,),安全地逐行读取 servers.csv 文件中的每一行。
执行结果显示,文件中记录的各服务器名称与状态信息已正确分别赋值给 name 和 status 变量,并按指定格式输出。

while IFS="," read -r name status; do echo “[상태 점검] $name 서버는 현재 $status 상태입니다.”; done < servers.csv

以上简要介绍了在 Linux Shell 脚本中 read 命令的基本用法以及实际工作中常用的文件逐行读取技巧。
建议根据今天整理的各种选项与示例,动手编写适合自身场景的交互式自动化脚本。