只问耕耘
分类: LINUX
2010-07-30 16:30:17
14.2.2 read命令
read命令是一个内置命令,用于从终端或文件读取输入(参见表14-1)。read命令读取一个输入行,直至遇到换行符。行尾的换行符在读入时将被转换成一个空字符。如果read命令后未跟变量名,读入的行将被赋给内置变量REPLY。也可以用read命令来中断程序的运行,直至用户输入一个回车键。要知道如何有效地使用read命令从文件读取输入行,请参见14.6节的“循环控制命令”。如果带-r选项,read命令将忽略反斜杠/换行符对,而把反斜杠作为行的一部分。read命令有4个控制选项:-a,-e,-p,-r②。
表14-1 read命令
格 式
含 义
read answer
从标准输入读取一行并赋值给变量answer
read first last
从标准输入读取一行,直至遇到第一个空白符或换行符。把用户键入的第一个词存到变量first中,把该行的剩余部分保存到变量last中
read
标准输入读取一行并赋值给内置变量REPLY
read –a arrayname
读入一组词,依次赋值给数组arrayname③
(续表)
格 式
含 义
read -e
在交互式shell命令行中启用编辑器。例如,如果编辑器是vi,则可以在输入行时使用vi命令③
read –p prompt
打印提示符,等待输入,并将输入赋值给REPLY变量③
read –r line
允许输入包含反斜杠③
范例14-4
(脚本)
#!/bin/bash
# Scriptname: nosy
echo -e "Are you happy? \c"
1 read answer
echo "$answer is the right response."
echo -e "What is your full name? \c"
2 read first middle last
echo "Hello $first"
echo –n "Where do you work? "
3 read
4 echo I guess $REPLY keeps you busy!
-------------------------------------------------------④
5 read -p "Enter your job title: "
6 echo "I thought you might be an $REPLY."
7 echo -n "Who are your best friends? "
8 read -a friends
9 echo "Say hi to ${friends[2]}."
-------------------------------------------------------
(输出)
$ nosy
Are you happy? Yes
1 Yes is the right response.
2 What is your full name? Jon Jake Jones
Hello Jon
3 Where do you work? the Chico Nut Factory
4 I guess the Chico Nut Factory keeps you busy!
5 Enter your job title: Accountant
6 I thought you might be an Accountant.
7,8 Who are your best friends? Melvin Tim Ernesto
9 Say hi to Ernesto.
说明
1. read命令接收一行用户输入,将其值赋给变量answer。
2. read命令从用户处接收输入,将输入的第一个词赋给变量first,将第二个词赋给变量middle,然后将直到行尾的所有剩余单词都赋给变量last。
3. 从标准输入读取一行,赋值给内置变量REPLY。
4. 显示变量REPLY的值。
5. 带-p选项的read命令,显示提示“Enter your job title:”,把输入行赋值给特定内置变量REPLY。
6. 在字符串中显示变量REPLY的值。
7. 请求用户输入。
8. 带-a选项的read命令将输入当作一组词组成的数组,数组名为friends,读入数组的元素是Melvin、Tim和Ernesto。
9. 显示friends数组的第3个元素。数组下标从0开始。
范例14-5
(脚本)
#!/bin/bash
# Scriptname: printer_check
# Script to clear a hung-up printer
1 if [ $LOGNAME != root ]
then
echo "Must have root privileges to run this program"
exit 1
fi
2 cat << EOF
Warning: All jobs in the printer queue will be removed.
Please turn off the printer now. Press return when you
are ready to continue. Otherwise press Control C.
EOF
3 read JUNK # Wait until the user turns off the printer
echo
4 /etc/rc.d/init.d/lpd stop # Stop the printer
5 echo -e "\nPlease turn the printer on now."
6 echo "Press Enter to continue"
7 read JUNK # Stall until the user turns the printer back on
echo # A blank line is printed
8 /etc/rc.d/init.d/lpd start # Start the printer
说明
1. 检查用户是否为root。如不是,则发送错误信息并退出。
2. 创建here文档。在屏幕上显示警告信息。
3. read命令等待用户输入。当用户按下回车键时,变量JUNK接收用户之前键入的内容。这个变量没什么实际用处。此处的read用来等待用户关闭打印机,然后回来按下回车键。
4. lpd命令终止打印机后台进程。
5. 现在重新打开打印机。
6. 如果已准备好,请求用户按下回车键。
7. 用户键入的任何内容都被读入变量JUNK,用户按下回车键之后,程序恢复运行。
8. lpd程序启动打印机后台进程。