手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

read(1)

名称

read - 从标准输入读取一行内容

用法概要

/usr/bin/read

/usr/bin/read [-r] var...

sh

read name...

csh

set variable= $<

ksh88

read [-prsu [n]] [name ? prompt] [name]...

ksh

read [-ACprs] [-d delim] [-n nsize] [-N nsize] [-t timeout] [-u unit] [vname?prompt] [vname... ] 

描述

/usr/bin/read

read 实用程序会从标准输入读取一行内容。

缺省情况下,除非指定了 –r 选项,否则反斜杠 (\) 会起着转义符的作用。如果标准输入为终端设备,且调用 shell 为交互式 shell,则 read 会在以下情况下提示续行符:

  • shell 读取以反斜杠结尾的输入行,除非指定了 –r 选项。

  • 输入 NEWLINE 字符后 here-document 未终止。

行会像 shell 中那样分成多个字段。第一个字段分配给第一个变量 var,第二个字段分配给第二个变量 var,以此类推。如果指定的 var 操作数少于字段数,则剩余的字段及其中间的分隔符会分配给最后一个 var。如果字段数少于 var 数,则剩余的 var 会设为空字符串。

var 操作数指定的变量设置会影响当前的 shell 执行环境。如果它是在一个子 shell 或单独的实用程序执行环境中调用的,例如下面所示的环境之一:

(read foo)
nohup read ...
find . -exec read ... \;

则它不会影响调用者的环境中的 shell 变量。

标准输入必须为一个文本文件。

sh

从标准输入读取一行内容,并使用内部字段分隔符 IFS(通常为空格或制表符)来界定词边界,且第一个词会分配给第一个 name,第二个词会分配给第二个 name,以此类推,而剩余的词会分配给最后一个 name。可使用 \newline 续行。NEWLINE 以外的字符可通过在前面加上反斜杠来引用。在将单词分配给 names 之前,这些反斜杠会被删除,而且系统不会解释反斜杠之后的字符。返回代码是0,除非遇到文件结尾。

csh

表示法:

set variable = $<

从标准输入加载一行内容作为 variable 的值。(请参见 csh(1)。)

ksh88

shell 输入机制。读取一行,并将 IFS 中的字符用作分隔符,进而将该行分为多个字段。转义符 (\) 用于去除下一个字符和续行符的任何特殊含义。在原始模式下,–r,\ 字符不会受到特殊处理。第一个字段分配给第一个 name,第二个字段分配给第二个 name,以此类推,而剩余的字段会分配给最后一个 name。通过 –p 选项,使用 |& 从 shell 产生的进程输入管道中获取输入行。如果存在 –s 标志,则会将输入作为命令保存在历史记录文件中。标志 –u 可用于指定从中读取的一位文件描述符单元 n。文件描述符可以通过 exec 特殊命令打开。n 的缺省值为 0。如果省略 name,则 REPLY 会用作缺省 name。退出状态为0 除非无法打开输入文件进行读取,或者遇到了文件结尾。具有 –p 选项的文件结尾可清除该进程,这样可以生成其他进程。如果第一个参数包含 ?,则当 shell 为交互式 shell 时,该单词的剩余部分将用作标准错误输出中的 prompt。退出状态为 0,除非遇到了文件结尾。

ksh

read 会从标准输入读取一行内容,并将 IFS 变量值中的字符用作分隔符,进而将该行分为多个字段。转义字符 \ 用于去除下一个字符和续行符的任何特殊含义,除非指定了 –r 选项。

如果变量多于字段,则将剩余的变量设为空字符串。如果变量少于字段,则将剩余的字段及其中间的分隔符分配给最后一个变量。如果未指定 var,则使用变量 REPLY

如果 var 具有二进制属性并且已指定 –n–N,则读取的字节会直接存储在 var 中。

如果在第一个 var 后指定了 ?prompt,则 read 会在标准输入为终端或管道时显示一个标准错误提示。

选项

/usr/bin/read、ksh88

/usr/bin/readksh88 支持以下选项:

–r

请勿以特殊方式处理反斜杠。将各个反斜杠视为输入行的一部分。

ksh

ksh 支持以下选项:

–A

取消设置 var,并创建一个索引数组,其中行中的每个字段从索引 0 开始。

–C

取消设置 var,并将 var 作为复合变量读取。

–d delim

一直读取到分隔符 delim,而非行的结尾。

–n nsize

最多读取 nsize 个字节。以字节为单位的二进制字段大小。

–N nsize

精确读取 nsize 个字节。以字节为单位的二进制字段大小。

–p

从当前协同进程(而非标准输入)读取内容。文件结尾会导致 read 与协同进程断开连接,因此可创建另一协同进程。

–r

处理输入行时,请勿对 \ 进行特殊处理。

–s

将输入副本保存为 shell 历史记录文件中的一个条目。

–t timeout

从终端或管道读取时,指定以秒为单位的 timeout

–u fd

从文件描述符编号 fd(而非标准输入)读取内容。缺省值为 "0"。

–v

从终端读取时,显示第一个变量的值,并将其作为缺省值。

操作数

支持下列操作数:

var

现有或非现有 shell 变量的名称。

示例

示例 1 使用 read 命令

以下 /usr/bin/read 示例会输出每行第一个字段移至该行结尾的文件:

example% while read -r xx yy
do
        printf "%s %s\n" "$yy" "$xx"
done < input_file

环境变量

有关影响 read 执行的以下环境变量的描述,请参见 environ(5):LANG、LC_ALL、LC_CTYPE、LC_MESSAGES 和 NLSPATH。

IFS

确定用于分隔字段的内部字段分隔符。

PS2

提供在读取到以反斜杠结尾的行且未指定 –r 选项时,或提供输入 NEWLINE 字符后 here-document 未终止时,交互式 shell 写入标准错误的提示字符串。

退出状态

将返回以下退出值:

0

成功完成。

>0

检测到文件结尾或发生错误。

属性

有关下列属性的说明,请参见 attributes(5)

/usr/bin/read、csh、ksh88、sh

属性类型
属性值
可用性
system/core-os
接口稳定性
Committed(已确定)
标准
请参见 standards(5)

ksh

属性类型
属性值
可用性
system/core-os
接口稳定性
Uncommitted(未确定)

另请参见

csh(1)ksh(1)ksh88(1)line(1)set(1)sh(1)attributes(5)environ(5)standards(5)