只问耕耘
分类:
2008-11-03 15:08:55
上一章我们谈到如何定义或取消变量,变量可被设置为当前shell的局部变量,或是环境变量。如果您的shell脚本不需要调用其他脚本,其中的变量通常设置为脚本内的局部变量(参见第13.10节“变量”)。
要获取变量的值,在美元符后跟变量名即可。shell会对双引号内的美元符后的变量执行变量扩展,单引号中的美元符则不会被执行变量扩展。
范例14-3
1 name="John Doe" or declare name="John Doe" # local variable
2 export NAME="John Doe" # global variable
3 echo "$name" "$NAME" # extract the value
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程序启动打印机后台进程。