Linux课后编程题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3.综合题
(1)试分别用grep、sed和awk实现:删除文件ifile中以#开始的注释行,并将结果输出的文件ofile;
解:
grep -v "^#" ifile
sed "/^#/d" ifile
awk '!/^#/ { print $0 }' ifile
(2)设计一个菜单shell程序,要求:
①捕获信号1、2、3、15;
②当在循环中,当收到信号后在终端上显示:“Received Signal #”,其中#为收到的信号编号。
解:方法有多种,下为其一。
trap "echo I received siganl 1" 1 # 捕获信号1
trap "echo I received siganl 2" 2 # 捕获信号2
trap "echo I received siganl 3" 3 # 捕获信号3
trap "echo I received siganl 15" 15 # 捕获信号15
echo "PID: $$" # 显示PID
while true # 循环
do
read x # 读一字符串。
#同时等待信号,此时可通过^C、^\等交互产生信号2和3
# 或从其它终端通过kill -Signal PID发来信号
if [ -z "$x" ]; then break; fi # 空串时跳出循环,结束程序
done。
程序捕获信号1、2、3和15,按回车结束。
(3)设有shell程序内容为:
pkg="dhcp"; x=`rpm –qa | grep $pkg`
if [ ! -z $x ]; then echo "Package: $pkg has been installed! " else rpm –ivh ${pkg}* #假设程序$pkg的内容在当前目录内存在 fi
试写出程序的功能和执行的可能结果。
解:若dhcp软件包没有安装,则安装之。
如果已经安装,则提示"Package: dhcp has been installed! "。
当然,还会显示安装过程信息。
说明:此题有点小问题,结果不太明确。
若要结果更准确点话,将原程序修改为:
pkg="dhcp"; x=`rpm -w $pkg`
if [ ! -z $x ]; then echo "Package: $pkg has been installed! " else rpm –ivh ${pkg}* #假设程序$pkg的内容在当前目录内存在 fi
(4)在UNIX/Linux系统中,环境变量是非常重要,在字符界面下试说明:
①PATH变量的作用,如何得到PATH的值?
②在UNIX/Linux系统的超级用户的环境变量PATH中允许包含当前目录吗?
③若在超级用户的当前目录内有可执行文件mypro,如何执行它(写出执行时键盘输入内容)?
④如何使用该命令在后台执行(写出执行时键盘输入内容)?
解:
①命令搜索路径;echo $PATH 或 env | grep PATH
②不能。
一般用户的PATH环境变量中,也不允许包含当前目录
③ /root/mypro。
若root用户工作在自己的家目录也可以这样运行./mypro
④ /root/mypro &
(5)设计一个shell程序计算n的阶乘。
要求:
①从命令行接收参数n;
②在程序开始后立即判断n的合法性,即是否有参数,若有是否为正整数,若非法请给错误提示;
③最后出计算的结果。
解:
#!/bin/sh
# 命令行参数检查
if [ $# -lt 1 ]; then # 没有参数,返回1
echo -e "$0 to get Factorial of a Number\nUsage: $0 N"; exit 1; fi
# 赋初值
m=1;y=1 # 赋初值。
m为阶乘,y为控制变量 # 计算
while true; do
m=`expr $m \* $y` # m=m*y y=`expr $y + 1` # y=y+1 if [ $y -gt $1 ]; then break; fi done # 输出
echo "$1!=$m"。