type
status
date
slug
summary
tags
category
icon
password
Property
有时,脚本需要在执行过程中,由用户提供一部分数据,这时可以使用
read
命令。它将用户的输入存入一个变量,方便后面的代码使用。用户按下回车键,就表示输入结束。read
命令的格式如下。options
是参数选项,variable
是用来保存输入数值的一个或多个变量名。如果没有提供变量名,环境变量REPLY
会包含用户输入的一整行数据。demo.sh
:上面例子中,先显示一行提示文本,然后会等待用户输入文本。用户输入的文本,存入变量
text
,在下一行显示出来。read
可以接受用户输入的多个值:如果用户的输入项少于
read
命令给出的变量数目,那么额外的变量值为空。如果用户的输入项多于定义的变量,那么多余的输入项会包含到最后一个变量中。如果
read
命令之后没有定义变量名,那么环境变量REPLY
会包含所有的输入。上面脚本的运行结果如下:
read
命令除了读取键盘输入,可以用来读取文件。上面的例子通过
read
命令,读取一个文件的内容。done
命令后面的定向符<
,将文件内容导向read
命令,每次读取一行,存入变量myline
,直到文件读取完毕。参数
read
命令的参数如下:- -t 参数,设置了超时的秒数。如果超过了指定时间,用户仍然没有输入,脚本将放弃等待,继续向下执行。
环境变量
TMOUT
也可以起到同样作用,指定read
命令等待用户输入的时间(单位为秒)。- -p 参数,指定用户输入的提示信息。
- -a 参数,参数把用户的输入赋值给一个数组,从零号位置开始。
- -n 参数,指定只读取若干个字符作为变量值,而不是整行读取。
- e 参数,允许用户输入的时候,使用
readline
库提供的快捷键,比如自动补全。
read
命令接受用户输入的文件名。这时,用户可能想使用 Tab 键的文件名“自动补全”功能,但是read
命令的输入默认不支持readline
库的功能。-e
参数就可以允许用户使用自动补全。- 其他参数
d delimiter
:定义字符串delimiter
的第一个字符作为用户输入的结束,而不是一个换行符。r
:raw 模式,表示不把用户输入的反斜杠字符解释为转义字符。s
:使得用户的输入不显示在屏幕上,这常常用于输入密码或保密信息。u fd
:使用文件描述符fd
作为输入。
IFS 变量
read
命令读取的值,默认是以空格分隔。可以通过自定义环境变量IFS
(内部字段分隔符,Internal Field Separator 的缩写),修改分隔标志。IFS
的默认值是空格、Tab 符号、换行符号,通常取第一个(即空格)。如果把
IFS
定义成冒号(:
)或分号(;
),就可以分隔以这两个符号分隔的值,这对读取文件很有用。IFS
设为冒号,然后用来分解/etc/passwd
文件的一行。IFS
的赋值命令和read
命令写在一行,这样的话,IFS
的改变仅对后面的命令生效,该命令执行后IFS
会自动恢复原来的值。如果不写在一行,就要采用下面的写法。另外,
<<<
是 Here 字符串,用于将变量值转为标准输入,因为read
命令只能解析标准输入。如果
IFS
设为空字符串,就等同于将整行读入一个变量。