您的当前位置:首页正文

Perl练习题(DOC)

2024-06-07 来源:步旅网


2.12 练习

写一个程序,计算半径为12.5的圆的周长。圆周长等于2π(π约为3.1415926)乘以半径。答案为78.5。 #!/usr/bin/perl $r=12.5;

$pai=3.1415926 ; $C=2*$pai*$r; Print “$C\\n”;

修改上述程序,用户可以在程序运行时输入半径。如果,用户输入12.5,则应得到和上题一样的结果。

#!/usr/bin/perl $r=; $pai=3.1415926 ; $C=2*$pai*$r; Print “$C\\n”;

修改上述程序,当用户输入小于0 的数字时,程序输出的周长为0,而非负数。 #!/usr/bin/perl $r=; $pai=3.1415926 ; if($r>=0){

$C=2*$pai*$r; } If($r<0){

$C=0; }

Print “$C\\n”;

写一个程序,用户能输入2 个数字(不在同一行)。输出为这两个数的积。 #!/usr/bim/perl $a=; $b=; $c=$a*$b; Print”$c”;

写一个程序,用户能输入1 个字符串和一个数字(n)(不在同一行)。输出为,n 行这个字符串,1 次1 行(提示,使用“x”操作符)。例如,如果用户输入的是“fred”和“3”,则输出为:3 行,每一行均为fred。如果输入为“fred”和“299792”,则输出为299792 行,每一行均为fred。

#!/usr.bin/perl

$string=; $int=;

$output=$string x $int print $output;

3.9练习

写一个程序,将一些字符串(不同的行)读入一个列表中,逆向输出它。如果是从键盘输入的,那在Unix 系统中应当使用CTRL+D 表明end-of-file,在Windows 系统中使用CTRL+Z.

写一个程序,读入一串数字(一个数字一行),将和这些数字对应的人名(下面列出的)输出来。(将下面的人名列表写入代码中)。fred betty barney dino Wilma pebbles bamm-bamm

例如,当输入为1,2,4 和2,则输出的为fred, betty, dino, 和betty

写一个程序,将一些字符串(在不同的行中)读入一个列表中。然后按ASCII 顺序将它们输出来。也就是说,当输入的字符串为fred, barney, wilma, betty,则输出为barney betty fred wilma。分别在一行或不同的行将之输出。 1:

#!/usr/bin/perl -w

@michael=reverse(<>); print \"@michael\";

或:

#!/usr/bin/perl -w

@userinput=; foreach (@userinput) {

unshift (@array,$_); }

print \"array is @array\\n\"; 2:

#!/usr/bin/perl

@name=qw(fred betty barney dino Wilma pebbles bamm-bamm); @number=<>; foreach (@number) {

print \"$name[$_-1]\\n\"; } 3:

#!/usr/bin/perl @array=<>;

@array=sort @array; print \"@array\";

4.11练习

写一个名为&total 的子程序,返回一列数字的和。

提示:子程序不应当有任何的I/O 操作;它处理调用的参数,返回处理后的值给调用者。结合下面的程序来练习,它检测此子程序是否正常工作。第一组数组之和我25。

my @fred = qw{ 1 3 5 7 9 }; my $fred_total = &total(@fred);

print \"The total of \\@fred is $fred_total.\\n\"; print \"Enter some numbers on separate lines: \"; my $user_total = &total();

print \"The total of those numbers is $user_total.\\n\";

利用上题的子程序,写一个程序计算从1 到1000 的数字的和。

额外的练习:写一个子程序,名为&above_average,将一列数字作为其参数,返回所有大于平均值的数字(提示:另外写一个子程序来计算平均值,总和除以数字的个数)。利用下面的程序进行测试: my @fred = &above_average(1..10); print \"\\@fred is @fred\\n\";

print \"(Should be 6 7 8 9 10)\\n\";

my @barney = &above_average(100, 1..10); print \"\\@barney is @barney\\n\"; print \"(Should be just 100)\\n\"; 1:

#!/usr/bin/perl -w #Date:2009-6-12

# Exercise 4-1 use strict;

sub total {

my $sum=shift @_; foreach (@_) { $sum=$sum+$_; } $sum; }

my @fred=qw {1 3 5 7 9}; my $fred_total=&total(@fred);

print \"The Total of \\@fred is $fred_total.\\n\";

print \"Enter some numbers on separate lines: \"; my $user_total = &total();

print \"The Total of those numbers is $user_total.\\n\"; 2:

#!/usr/bin/perl -w #Date:2009-6-12

# Exercise 4-2 use strict;

sub total {

my $sum=shift @_; foreach (@_) { $sum=$sum+$_; } $sum; }

my @array=1 .. 1000;

my $array_total=&total(@array);

print \"The sum of 1 to 1000 is $array_total.\\n\"; 3:

#!/usr/bin/perl -w #Date:2009-6-12

# Exercise 4-3 use strict;

sub average {

my $number=@_; my $sum=shift @_; foreach (@_) { $sum=$sum+$_; }

my $array_average=$sum/$number; }

sub above_average { my @above; foreach (@_) {

if ($_>&average(@_)) { push @above,$_; } } @above; }

my @above_fred = &above_average(1 .. 10);

print \"The above average of \\@fred is @above_fred\\n\";

my @above_barney = &above_average(100, 1 .. 10);

print \"The above average of \\@barney is @above_barney\\n\";

5.11练习

写一个程序,类似于cat,但保持输出的顺序关系。(某些系统的名字可能是tac。)如果运行此程序:./tac fred barney betty, 输出将是文件betty 的内容,从最后一行到第一行,然后是barney, 最后是fred, 同样是从最后一行到第一行。(注意使用./确保调用的是你自己的程序,而非系统提供的)

写一个程序,要求用户在不同的行中输入一些字符串,将此字符串打印出来,规则是:每一条占20 个字符宽度,右对齐。为了确保正确的输出,在开头打印出一串数字作为比较(帮助调试)。注意,不要犯19 个字符宽度的错误。例如,如果输入,hello, good-bye,则输出为:

123456789012345678901234567890123456789012345678901234567890 hello good-bye

修改上一个程序,允许用户选择宽度,如,用户输入30,hello, good-bye(在不同

的行中),则每一行的宽度为30。(提示:参阅第二章相应部分)。提示,如果选择的宽度太长,可以增加比较行的长度。 1:

#!/usr/bin/perl -w #Date:2009-6-18

# Exercise 5-1 print reverse <>; 2-3:

#!/usr/bin/perl -w #Date:2009-6-18

# Exercise 5-2 print \"What column width would you like?\"; chomp (my $width = );

print \"Enter some lines, then press Ctrl+D:\\n\"; chomp (my @line = );

print \"1234567890\" x (($width+9)/10), \"\\n\"; foreach (@line) {

printf \"%${width}s\\n\}

chapter2 1.

-----------------------/home/confish/perl/girth #!/usr/bin/perl -w

#this program calculate a circle's girth #confish@ubuntu7.10 $r=12.5;

$g=12.5*2*3.1415;

print \"the girth of the circle is $g\\n\";

-----------------------/home/confish/perl/girth 2.

-----------------------/home/confish/perl/girthpro #!/usr/bin/perl -w

#a better one to calculate girth #confish@ubuntu7.10

print\"enter the radius of the circle\\n\"; chomp($r=); if($r>0) {

print\"the girth of the circle is \".$r*2*3.1415.\"\\n\"; } else {

print\"nonavailable!\\n\"; }

-----------------------/home/confish/perl/girthpro 3.

-----------------------/home/confish/perl/girthzero #!/usr/bin/perl -w

#calculate the girth and print 0 when the radius is lower than 0 #confish@ubuntu7.10

print\"enter the radius of the line\\n\"; chomp($r=); if($r>0) {

print\"the girth of the circle is $r*2*3.1415\\n\"; } else {

print\"the girth of the circle is 0\\n\"; }

-----------------------/home/confish/perl/girthzero 4.

-----------------------/home/confish/perl/product #!/usr/bin/perl -w

#print the two number's product #confish@ubuntu7.10

print\"enter the two numbers:\\n\"; chomp($m=); chomp($n=);

print\"the product of the two numbers are \".$m*$n.\"\\n\"; -----------------------/home/confish/perl/product 5.

-----------------------/home/confish/perl/printer #!/usr/bin/perl -w

#print a string certain times depend on the usr's input #confish@ubuntu7.10

print\"enter a string and a number:\\n\"; $str=;

chomp($num=); print ${str}x$num;

-----------------------/home/confish/perl/printer chapter3 1.

------------------------------------/home/confish/reprint #!/usr/bin/perl -w

#read some input and print them in reverse sequence

#confish@ubuntu7.10

print \"enter the string please:\\n\"; @str=reverse ;

print \"\\nthe reverse strings are:\\n@str\";

------------------------------------/home/confish/reprint 2.

------------------------------------/home/confish/num_to_name #!/usr/bin/perl -w

#read some numbers and output the match name #confish@ubuntu7.10 $i=0;

@names=qw /fred betty barney dino Wilma pebbles bamm-bamm/; print\"enter the numbers please:\\n\"; chomp(@nums=); foreach(@nums) {

@re=@names; while($i ne $_)

{

$n=shift( @re); $i++;

}

$i=0;

print $n,\"\\n\"; }

------------------------------------/home/confish/num_to_name 3.

------------------------------------/home/confish/sort_str #!/usr/bin/perl -w

#read some strings and sort them in ASCII #confish@ubuntu7.10

chomp(@str=sort);

#@str=sort; will print them in diffrent lines print @str,\"\\n\";

------------------------------------/home/confish/sort_str

chapter4 1.

--------------------------------/home/confish/perl/subr

#!/usr/bin/perl -w

#a subroutine named total returns sum of numbers #confish@ubuntu7.10 sub total {

foreach $n(0..$#_) {

$sum+=$_[$n]; }

$sum; }

my@fred=qw{1 3 5 7 9};

my $fred_total=&total(@fred);

print\"The total of \\@fred is $fred_total.\\n\"; print\"Enter some numbers on separate lines:\\n\"; my $user_total=&total();

print\"The total of those numbers is $user_total.\\n\"; --------------------------------/home/confish/perl/subr 2.

--------------------------------/home/confish/perl/suber #!/usr/bin/perl -w

#use the subroutine in last program to get the sum of 1..1000 #confish@ubuntu7.10 sub total {

foreach $n(0..$#_) {

$sum+=$_[$n]; } $sum; }

@num=(1..1000); $sum=&total(@num);

print\"The sum of 1..1000 is $sum\\n\";

--------------------------------/home/confish/perl/suber 3.

--------------------------------/home/confish/perl/aver #!/usr/bin/perl -w

#to print the number which is larger than the average #in some numbers #confish@ubuntu7.10 sub average {

foreach $n(0..$#_) {

$sum+=$_[$n]; }

$average=$sum/($#_+1); }

sub above_average {

@num=@_;

@aba=();

$av=&average(@num); foreach $n(0..$#_) {

if($_[$n]>$av)

{

push ( @aba,$_[$n]); } }

@aba; }

my @fred=&above_average(1..10); print\"\\@fred is @fred\\n\";

print\"(Shuold be 6 7 8 9 10)\\n\";

my @barney=&above_average(100,1..10); print\"\\@barney is @barney\\n\"; print\"(Should be just 100)\\n\";

--------------------------------/home/confish/perl/aver chapter5 1.

----------------------------------/home/confish/perl/tac #!/usr/bin/perl -w

#a prog same as cat but reverse the string #confish@ubuntu7.10

@ARGV=reverse @ARGV; @a=reverse<>; print @a;

----------------------------------/home/confish/perl/tac 2.

----------------------------------/home/confish/perl/20str #!/usr/bin/perl -w

#a prog that print the strings as 20 words flush right

#confish@ubuntu7.10 @str=; while($i!=5) {

foreach(0..9) {

print; } $i++; } print\"\\n\"; foreach(@str) {

printf \"%21s\ }

----------------------------------/home/confish/perl/20str 3.

----------------------------------/home/confish/perl/20strpro #!/usr/bin/perl -w

#a prog print the strings as number usr apionted words flush right #confish@ubuntu7.10 @str=; while($i!=5) {

foreach(0..9) { print; } $i++; } print \"\\n\";

$num=shift @str; chomp $num;

$conv=\"%\".++$num.\"s\"; foreach(@str) {

printf $conv,$_; }

----------------------------------/home/confish/perl/20strpro chapter6 1.

-------------------------------------/home/confish/perl/hash #!/usr/bin/perl -w

#hashs that print the name's family name #confish@ubuntu7.10

$family_name{\"fred\$family_name{\"barney\$family_name{\"wilma\print \"enter the given name please:\\n\"; chomp($gn=);

print \"family name for $gn is $family_name{$gn}\\n\"; ------------------------------------/home/confish/perl/hash 2.

------------------------------------/home/confish/perl/counts #!/usr/bin/perl -w

#hashs that counts the appearance times of the word #print sorted

#confish@ubuntu7.10

print \"enter the word please:\\n\"; foreach(<>) {

$counts{$_}++; $counts{$_}.=\"\\n\"; } sort %counts; print %counts;

------------------------------------/home/confish/perl/counts

chapter7 1.

-------------------------------------------/home/confish/perl/pfred #!/usr/bin/perl -w

#prog print the line which contains \"fred\" #confish@ubuntu7.10 foreach(<>) {

if(/fred/) {

print $_; } }

-------------------------------------------/home/confish/perl/pfred 2.

-------------------------------------------/home/confish/perl/pffred #!/usr/bin/perl -w

#prog print the line which contains \"fred\" or \"Fred\" #confish@ubuntu7.10

foreach(<>) {

if(/fred|Fred/) {

print $_; } }

-------------------------------------------/home/confish/perl/pffred 3.

-------------------------------------------/home/confish/perl/pp #!/usr/bin/perl -w

#prog print the line which contains a point #confish@ubuntu7.10 foreach(<>) {

if(/\\./) {

print $_; } }

-------------------------------------------/home/confish/perl/pp 4.

-------------------------------------------/home/confish/perl/plg #!/usr/bin/perl -w

#print the line which contains not capitals only #

confish@ubuntu7.10 foreach(<>) {

if(/[a-z][A-Z]|[A-Z]+[a-z]/) {

print $_; }

}

-------------------------------------------/home/confish/perl/plg 5.

-------------------------------------------/home/confish/perl/pfw #!/usr/bin/perl -w

#print a line which contains fred and wilma #confish@ubuntu7.10 foreach(<>) {

if(/wilma.+fred|fred.+wilma/) {

print $_; } }

------------------------------------------/home/confish/perl/pfw chapter8 1.

----------------------------------------------/home/confish/perl/mm #!/usr/bin/perl -w #match \"match\"

#confish@ubuntu7.10 while(<>) {

chomp; if(/match/) {

print \"Matched:|$`<$&>$'|\\n\"; } else {

print \"no match:|$_|\\n\"; } }

---------------------------------------------/home/confish/perl/mm 2.

---------------------------------------------/home/confish/perl/ma #!/usr/bin/perl -w

#match \"word\" ends with a #confish@ubuntu7.10 while(<>) {

chomp; if(/a\\b/) {

print \"Matched:|$`<$&>$'|\\n\"; } else {

print \"no match:|$_|\\n\"; } }

---------------------------------------------/home/confish/perl/ma 3.

---------------------------------------------/home/confish/perl/mapro #!/usr/bin/perl -w

#match word end with a and storage it #confish@ubuntu7.10 while(<>) {

chomp; if(/(a$)/) {

my $temp=$1;

print \"\\$1 contains '$`$&$''\\n\"; } else {

print \"no match:|$_|\\n\"; } }

---------------------------------------------/home/confish/perl/mapro 4.

---------------------------------------------/home/confish/perl/mwa #!/usr/bin/perl -w

#match a word end with a and print the next five character #confish@ubuntu7.10 while(<>) {

if(/a\\b/) {

my $temp=$';

if($temp=~/.{0,5}/) {

my $match=$&; print $match; } } else {

print \"no match:|$_|\\n\"; } }

---------------------------------------------/home/confish/perl/mwa 5.

---------------------------------------------/home/confish/perl/ms #!/usr/bin/perl -w #match a space

#confish@ubuntu7.10 while(<>)

{

if(/ +$/) {

print; } }

---------------------------------------------/home/confish/perl/ms chapter9 1.

---------------------------------------------/home/confish/perl/sfb #!/usr/bin/perl -w

#match and replace fred three times #confish@ubuntu7.10 my $what=\"fred|barney\";

if(\"fredbarneybarney\"=~/($what){3}/) {

print $`.\"/\".$&.\"/\".$'.\"\\n\"; }

---------------------------------------------/home/confish/perl/sfb 2.

---------------------------------------------/home/confish/perl/sfl #!/usr/bin/perl -w #match fred to Larry #confish@ubuntu7.10 $^I=\".out\"; while(<>) {

s/fred/Larry/i; print; }

---------------------------------------------/home/confish/perl/sfl 3.

---------------------------------------------/home/confish/perl/addc #!/usr/bin/perl -w #add copyright

#confish@ubuntu7.10 $^I=\".out\";

$a=\"/usr/bin/perl -w \\n #Copyright(C) 2008 by Yours Truly confish\"; while(<>) {

s#/usr/bin/perl\\s+-w#$a#i; print; }

---------------------------------------------/home/confish/perl/addc

chapter10 1.

---------------------------------------------/home/confish/perl/gn #!/usr/bin/perl -w

#a game to guess a number #confish@ubuntu7.10 my $y=int(1+rand(100));

print\"enter a number please:\\n\"; while(chomp($t=)) {

if($t ne \"exit\"&&$t ne\"quit\" ) {

if($t>$y) {

print\"tow hig\\n\"; }

elsif($t<$y) {

print\"two low\\n\"; } else {

print \"a\\n\";last; } } else { last; } }

--------------------------------------------/home/confish/perl/gn chapter11 1.

------------------------------------------------/home/confish/perl/crw #!/usr/bin/perl -w

#to check whether a file is exits have readability and writeable #confish@ubuntu7.10 foreach(@ARGV) {

if(-e) {

print \"$_ exits\\n\"; if(-r) {

print \"$_ readable\\n\"; } else {

print\"$_ does not be readable\\n\"; } if(-w) {

print \"$_ writeable\\n\"; } else {

print \"$_ does not be writeable\\n\"; } } else {

print \"$_ does not exits\\n\"; } }

------------------------------------------------/home/confish/perl/crw 2.

------------------------------------------------/home/confish/perl/et #!/usr/bin/perl -w

#to check the longest exits file #confish@ubuntu7.10 if(@ARGV) {

foreach(@ARGV) {

if(-M>$such) {

$such=-M; $file=$_; } }

print\"$file has exits $such days\\n\"; } else {

print \"no input files\\n\";

}

------------------------------------------------/home/confish/perl/et

14.13 bash shell的习题

习题54 第一个bash shell脚本

1. 编写一个名为greetme的脚本,它包括以下内容。

a) 包含一段注释,列出您的姓名、脚本的名称和编写这个脚本的目的。

b) 问候用户。

c) 显示日期和时间。

d) 显示这个月的日历。

e) 显示您的机器名。

f) 显示当前这个操作系统的名称和版本(cat /etc/motd)。

g) 显示父目录中的所有文件的列表。

h) 显示root正在运行的所有进程。

i) 显示变量TERM、PATH和HOME的值。

j) 显示磁盘使用情况(du)。

k) 用id命令打印出您的组ID。

l) 显示“Please,couldn you loan me $50.00?”

m) 跟用户说“Good bye”并且告诉他当前的时间(请参考date命令的手册页)。

2. 确保脚本可执行。

chomd +x greetme

您的脚本中第一行是什么?为什么要加这一行?

习题55 命令行参数

1. 编写一个名为rename的脚本,这个脚本需要两个参数:第一个参数是文件的

原名,第二个参数则是文件的新名称。

如果用户没有提供两个参数,就在屏幕上显示一条信息提示脚本的用法,然后退出脚本。下面是说明该脚本如何工作的一个例子:

$ rename

Usage: rename oldfilename newfilename $

$ rename file1 file2

file1 has been renamed file2

Here is a listing of the directory:

a file2

b file.bak

2. 下面的find命令(SunOS系统上)将列出根分区上所有大于100KB、并且在上周被修改过的文件,(查看自己所用系统上的手册页,以确定find命令在当前系统上的正确语法)。

find / -xdev –mtime -7 –size +200 –print

3. 编写一个名为bigfiles的脚本。这个脚本带两个参数:一个是mtime的值,另一个则是size的值。如果用户没有提供两个参数,就向stderr发送一条合适的报错信息。

4. 编写一个名为vib的脚本,用它来为vi创建备份文件。备份文件的名称是在原始文件的名称加上后缀.bak。

习题56 获取用户的输入

1. 编写一个名为nosy的脚本,该脚本将执行下列操作:

a) 询问用户的全名——名字和姓。

b) 用用户的名字问候他(她)。

c) 询问用户的出生年份,并计算出他(她)的年龄(使用let命令)。

d) 询问用户的登录名,并打印他(她)的用户ID(从/etc/passwd中获得)。

e) 告诉用户他(她)的主目录在哪儿。

f) 向用户显示他(她)正在运行的进程。

g) 告诉用户现在是星期几,并且用非军用的时间格式告诉他(她)现在的时间。输出结果应类似于:

The day of the week is Tuesday and the current time is 04:07:38 PM.

2. 创建一个名为datafile的文本文件(除非已提供了这个文件)。文件中每条记录包含若干由冒号分隔的字段。记录中的字段包括:

a) 名和姓

b) 电话号码

c) 地址

d) 出生日期

e) 工资

3. 创建一个名为lookup的脚本,让它完成如下任务:

a) 包含一段注释,用来说明脚本名、作者姓名、时间和编写这个脚本的原因。编写这个脚本的目的是要将datafile的内容按顺序显示。

b) 按姓氏对datafile排序。

c) 向用户显示datafile的内容。

d) 告诉用户文件中一共有多少条记录。

4. 尝试用-x和-v选项来调试脚本。如何使用这些命令?它们有何不同?

习题57 条件语句

1. 编写一个名为checking的脚本来执行如下操作:

a) 接收一个命令行参数:用户的登录名。

b) 检查用户是否提供了命令行参数。

c) 检查用户是否在/etc/passwd文件中,如果在,就显示信息:

Found in the /etc/passwd file.

若不在,则显示信息:

No such user on our system.

2. 在脚本lookup中,询问用户是否要往文件datafile增加一条记录。如果用户回答yes或y,则:

a) 提示用户输入姓名、电话号码、地址、出生日期和工资。将每一项分别保存在一个单独的变量中。在字段间加冒号,然后把这条信息追加到文件datafile尾部。

b) 按姓氏对该文件排序。告诉用户这条记录已被加入,向他(她)显示该行,并在行首标出行号。

习题58 条件语句与文件测试

1. 改写checking脚本。检查完指定的用户是否在/etc/passwd文件中之后,程序接着检查这个用户是否已登入系统。如果是,程序就打印出正在运行的所有进程。否则,程序将告诉用户:

<所指定的用户> is not logged on.

2. 用let命令计算一组等级。脚本请用户输入他(她)在一次考试中的分数(使用declare –i),然后测试用户输入的分数是否在有效范围0~100之内。如果不在,则程序退出。如果在,则显示用户的等级字母,如:You receive an A. Excellent!不同等级的分数范围:A(90-100) B(80-89) C(70-79) D(60-69) F(小于60)

3. 脚本lookup要依靠datafile文件才能运行。在脚本lookup中,检查文件datafile是否存在,是否可读且可写。在脚本lookup中增加一个如下所示的菜单。

[1] Add entry

[2] Delete entry

[3] View entry

[4] Exit

您已经在脚本中写了增加条目(Add entry)的部分。现在要在增加条目的程序中添

加代码,以检查用户提供的姓名是否已在文件datafile中出现。如果在,就告诉用户。如果不在,则增加这条新记录。

现在编写删除条目(Delete entry)、查看条目(View entry)和退出(Exit)函数的代码。

脚本中处理删除的部分应该首先检查条目是否存在,然后才去删除它。如果条目不存在,则向用户报告错误。如果存在,就删除它,并且告诉用户条目已被删除。退出时,一定要用一个数字来代表适当的退出状态。

如何从命令行检查退出状态?

习题59 case语句

1. BSD Berkeley UNIX上的ps命令与System 5(AT&T UNIX)以及Linux上的有所不同。BSD Unix的ps命令使用BSD选项。在System 5上,列出所有进程的命令是:

ps –ef

而BSD UNIX上对应的命令则是:

ps –aux

请您编写一个名为systype的程序,用它来检查各种不同的系统类型。要测试的系统将包括: AIX

Darwin(Mac OS X)

Free BSD

HP-UX

IRIX

Linux OS

OSF1 SCO

SunOS(Solaris/SunOS)

ULTRIX

Solaris、HP-UX、SCO和IRIX是AT&T一类的系统,其余的则是BSD风格的系统。

您正在使用的UNIX的版本信息将被打印到stdout。系统的名称可以用uname –s命令或从文件/etc/motd中获得。

2. 编写一个名为timegreet的脚本,完成下面的任务:

a) 在脚本顶部编写一个注释段,说明作者姓名、日期和程序的目的。

b) 把下面的用if/elif实现的程序转换为用case命令来实现。

#!/bin/bash

# Conmment section

you=$(date +%H)

echo \"The time is: $(date +%T)\"

if ((hour > 0 && hour <12)) then

echo \"Lnuch time!\"

elif ((hour > 12 && hour <16)) then

echo \"Good afternoon, $you!\" else

echo \"Good noght, $you. Sweet dreams.\" fi

习题60 循环

选做一题:

1. 编写一个名为mchecker的脚本,用来检查是否有新邮件到达,如果有新邮件,则在屏幕上显示一条消息。

a) 程序取得用户的邮件假脱机文件的长度(AT&T类系统上,邮件假脱机文件的位置是/usr/mail/$LOGNAME中,UNIX类系统上,假脱机文件的位置是在/usr/spool/mail/$USER中。如果您找不到它们,可以使用find命令)。这个脚本将连续循环运行,每30秒一次。每一轮循环时,脚本都将邮件假脱机文件的长度与上一轮循环时取得的长度进行比较。如果新的长度大于旧的长度,就在屏幕上显示一条消息:<用户名>,You have new mail.

文件的长度可以从ls –l,wc –c和find命令的输出中找到。

2. 编写一个脚本完成下面的任务。

a) 在脚本顶部编写一个注释段,说明作者姓名、日期和编写程序的目的。

b) 使用select循环生成一个食品菜单。

c) 程序的输出如下所示:

1) steak and potatoes

2) fish and chips

3) soup and salad

Please make a selection. 1

Stick to your ribs.

Watch your cholesterol.

Enjoy your meal.

1) steak and potatoes

2) fish and chips

3) soup and salad

Please make a selection. 2

British are coming!

Enjoy your meal.

1) steak and potatoes

2) fish and chips

3) soup and salad

Please make a selection. 3

Health foods...

Dieting is so boring.

Enjoy your meal.

3. 编写一个名为dusage的脚本程序,向一组用户逐一发送邮件,告诉用户他(她)当前已用的磁盘块数目。用户名列表保存在文件potential_hogs中。potential_hogs存在一个用户名为admin。

a) 用文件测试检查文件potential_hogs是否存在并可读。

b) 用循环遍历整个用户名列表。只向磁盘用量超过500块的用户发送邮件。跳过用户admin,不向他(她)发邮件,也就是说,admin用户不会收到该邮件信息。邮件的信息保存在dusage脚本的here文档中。

c) 保存一份收到邮件的用户的名单。通过创建日志文件来完成这一目标。给用户列表上所有用户都发送完邮件后,打印收到邮件的人数及名单。

习题61 函数

1. 将实习题59中的systype程序改写为一个返回系统名的函数。调用该函数来确定使用ps命令时应使用哪些选项。

在AT&T UNIX上列出所有进程的ps命令为:

ps –ef

而在UNIX/BSD UNIX/Linux上,命令为:

ps –aux or ps aux22

2. 编写一个名为cleanup的函数,它将删除所有临时文件并退出脚本。如果程序运行过程中收到终端或挂起信号,trap命令将调用cleanup函数。

3. 用here文档在脚本lookup中增加一个如下所示的菜单。

[1] Add entry

[2] Delete entry

[3] Change entry

[4] View entry

[5] Exit

为每个菜单项编写一个处理函数。用户选择一个有效菜单项之后,程序执行对应的函数,然后询问用户是否想再看一遍菜单。如果用户输入菜单项无效,则显示信息:

Invalid entry, try again.

然后重新显示菜单。

4. 在lookup脚本的菜单项View entry下创建一个子菜单。询问用户是否要看所选的那个人的某项特定信息:

a) Phone

b) Address

c) Birthday

d) Salary

5. 在脚本使用trap命令,使程序在运行过程中收到中断信号时,以执行清除操作。

因篇幅问题不能全部显示,请点此查看更多更全内容