The read
Linux 中的命令允许您从标准输入或文件中读取输入。
它允许您接收数据并将其分配给变量。本教程将指导您完成不同的选项read
命令。
读取用户的输入
的基本用途read
命令是从用户那里获取输入。这是一个简单的例子:
echo "Please enter your name:"
read name
echo "Welcome, $name!"
当您运行上面的脚本时,您将看到:
Please enter your name:
然后输入您的名字,例如“John”,输出将变为:
Welcome, John!
在这里,回显命令提示输入您的姓名,然后read
命令将您的输入存储在变量中name
。最后,echo
命令会打印一条带有您输入的姓名的欢迎消息。
从文件中读取输入
The read
命令可用于从文件中逐行读取输入。操作方法如下:
while IFS= read -r line
do
echo "Line: $line"
done < file.txt
If file.txt
包含:
First line
Second line
输出将是:
Line: First line
Line: Second line
在这个例子中,我们使用一个while 循环和read
命令与-r
读取每一行的选项file.txt
.
The IFS
变量设置为空值以保留前导和尾随空格,并且每一行都会回显到控制台。
指定分隔符
The read
默认情况下,命令读取输入直到遇到换行符(\n
).
但是,在某些情况下您可能想要更改此默认行为,这就是-d
选项开始发挥作用。
随着-d
选项,您可以指定除换行符之外的分隔符。
echo "Enter Text and to finish, write semicolon"
read -d ';' text
echo "The Text: $text"
在此示例中,-d ';'
选项告诉read
命令读取输入直到遇到分号。
将值读入数组(多个值)
The -a
选项允许您将输入值读取到数组中。这是一个例子:
echo "Please enter four numbers separated by space:"
read -a numbers
echo "You entered: ${numbers[0]}, ${numbers[1]}, ${numbers[2]}, ${numbers[3]}"
如果您输入:
10 20 30 40
输出将是:
You entered: 10, 20, 30, 40
上面的示例读取输入数字并将它们存储在名为的数组中numbers
。然后使用数组索引访问数组中的值。
发送前导航/编辑输入
The -e
选项中的read
命令启用 Readline 支持,允许您使用箭头键、删除键等编辑输入行。
echo "Please enter a sentence (use arrow keys to navigate):"
read -e sentence
echo "You entered: $sentence"
运行此代码时,您可以使用箭头键浏览文本,编辑文本,当您按 Enter 时,它将显示:
You entered: [Your edited sentence]
通过启用 Readline,您可以在收集用户输入时提供增强的编辑体验。
编辑预加载文本
随着-i
选项,您可以使用用户可以编辑的特定文本预加载输入缓冲区。
echo "Edit the following sentence:"
read -e -i "The quick brown fox jumps over the lazy dog." sentence
echo "You entered: $sentence"
当您运行此命令时,输入行将预加载:
The quick brown fox jumps over the lazy dog.
您可以编辑这句话,最终输出将反映您的更改:
You entered: [Your edited sentence]
The -i
选项结合-e
启用 Readline 并预加载文本,提供一种强大的方式来提供用于编辑的默认输入。
最多读取 NCHARS 个字符
The -n
选项允许您指定要读取的字符数,而不是读取整行。
echo "Enter your 5-character username:"
read -n 5 username
echo "You entered: $username"
如果您输入:
James
输出将是:
You entered: James
此示例将输入限制为正好 5 个字符。该命令在输入 5 个字符后返回,无需等待 Enter 键。
准确读取 NCHARS 字符
The -N
选项精确读取指定数量的字符,与-n
选项,如果遇到换行符,则返回更少的字符。
echo "Enter exactly 5 characters:"
read -N 5 exact_chars
echo "You entered: $exact_chars"
如果您输入:
Linux
输出将是:
You entered: Linux
即使在第五个字符之前输入了换行符,上面的示例也恰好读取 5 个字符。这确保了输入的特定长度。
读取前输出字符串PROMPT
随着-p
选项,您可以在读取输入之前直接输出提示字符串。
read -p "Enter your name: " name
echo "Welcome, $name!"
如果您输入:
Alice
输出将是:
Welcome, Alice!
在这里,-p
选项用于直接从read
命令,无需单独的echo
命令。
不要将反斜杠解释为转义字符
默认情况下,输入中的反斜杠被视为转义字符。这-r
选项禁用此行为。
echo "Enter a string with backslashes:"
read -r backslashes
echo "You entered: $backslashes"
如果您输入:
This is a test with backslashes: \test\example
输出将完全相同:
You entered: This is a test with backslashes: \test\example
静音模式
The -s
选项允许您在键入字符时抑制字符的回显。这通常用于输入密码。
read -s -p "Enter your password: " password
echo "Password entered successfully!"
当您输入密码时:
[Your password]
Output:
Password entered successfully!
您的密码不会显示在屏幕上。
超时并返回失败
The -t
选项允许您设置超时read
命令。如果在指定时间内未提供输入,该命令将返回失败。
read -t 5 -p "You have 5 seconds to enter your name: " name
echo "Hello, ${name:-Guest}!"
如果您在 5 秒内输入您的姓名,则输出将为:
Hello, [Your Name]!
如果您在 5 秒内没有输入任何内容,则输出将为:
Hello, Guest!
The -t 5
选项设置输入的 5 秒超时。如果未及时输入,则使用默认值“Guest”。
从文件描述符读取
The -u
选项允许您指定要读取的文件描述符,而不是标准输入。
exec 3< file.txt
read -u 3 line
echo "Read from file descriptor: $line"
exec 3<&-
If file.txt
包含:
This is a test line.
输出将是:
Read from file descriptor: This is a test line.
在这里,你打开file.txt
在文件描述符 3 上,然后使用read -u 3
从该描述符读取的命令。最后,您可以使用以下命令关闭文件描述符exec 3<&-
.
安全考虑
当使用read
命令处理用户输入,安全性必须是优先考虑的。有两个主要方面需要考虑:
防止代码注入:在未经验证的命令中使用输入时要小心,因为如果未经验证,将导致代码注入。
read -p "Enter a command: " cmd
eval "$cmd"
该代码很危险,因为它允许执行任何命令。您必须在执行之前验证并清理输入。
验证和清理用户输入:始终根据预期模式验证输入,并在必要时对其进行清理。
read -p "Enter a number: " number
if [[ ! "$number" =~ ^[0-9]+$ ]]; then
echo "Invalid input. Please enter a number."
exit 1
fi
此代码确保输入是数字并拒绝任何其他内容。
通过关注这些方面,您可以最大限度地降低风险并保护系统免受潜在的安全漏洞的影响。
现实世界的例子
这是一个关于如何使用的真实示例read
创建基本登录脚本的命令:
#!/bin/bash
read -p "Username: " username
read -s -p "Password: " password
echo
# Simulate user validation (Replace with real validation in production)
if [[ "$username" == "admin" && "$password" == "secret" ]]; then
echo "Access granted."
else
echo "Access denied."
fi
该脚本提示用户输入用户名和密码,然后将输入的值与预定的凭据进行比较。
- The
-p
选项提示输入用户名。
- The
-s
选项在提示输入密码时隐藏输入。
- 一个简单的 if 语句检查输入的凭据是否与预期相符,并提供适当的反馈。
注意:这是一个非常简单的示例,在生产环境中,您应该使用正确的身份验证和安全实践。