有时,脚本需要在执行过程中,由用户提供一部分数据,这时可以使用read命令。它将用户的输入存入一个变量,方便后面的代码使用。用户按下回车键,就表示输入结束。read命令的格式如下。
1 | read [-options] [variable...] |
read可以接受用户输入的多个值,read根据用户的输入,以变量IFS分隔(默认是空格),为多个变量赋值。
如果输入项少于read命令给出的变量数目,那么额外的变量值为空。如果输入项多于定义的变量,那么多余的输入项会包含到最后一个变量中。
1 |
|
read命令除了读取键盘输入,可以用来读取文件。read命令每次读取一行内容,存入变量myline,直到文件读取完毕。
1 |
|
read命令的部分参数如下:
-t 参数
read命令的-t参数,可以设置超时的秒数。如果超过了指定时间,用户仍然没有输入,脚本将放弃等待,继续向下执行。
1 |
|
环境变量TMOUT也可以起到同样作用,指定read命令等待用户输入的时间(单位为秒)。
1 | $ TMOUT=3 |
-p 参数
-p参数可以指定提示信息。
1 | read -p "Enter one or more values > " |
-a 参数
-a参数把用户的输入赋值给一个数组,从零号位置开始。
1 | $ read -a people |
上面例子中,用户输入被赋值给一个数组people,这个数组的2号成员就是dodo。
-n 参数
-n参数指定只读取若干个字符作为变量值,而不是整行读取。
1 | # 指定只读取3个字符 |
read命令读取的值,默认是以空格分隔。可以通过自定义环境变量IFS(内部字段分隔符,Internal Field Separator 的缩写),修改分隔标志。
如果把IFS定义成冒号(:)或分号(;),就可以分隔以这两个符号分隔的值,这对读取文件很有用。
1 |
|
上面例子中,IFS设为冒号,然后用来分解/etc/passwd文件的一行。IFS的赋值命令和read命令写在一行,这样的话,IFS的改变仅对后面的命令生效,该命令执行后IFS会自动恢复原来的值。如果不写在一行,就要采用下面的写法。
1 | OLD_IFS="$IFS" |
另外,上面例子中,<<<是 Here 字符串,用于将变量值转为标准输入,因为read命令只能解析标准输入。