12章
Shell脚本编程

 


Shell命令行的执行


编写、改动权限和运行Shell程序的步骤


在Shell程序中使用參数和变量


表达式比較、循环结构语句和条件结构语句


在Shell程序中使用函数和调用其它Shell程序

12-1  
Shell
命令行书写规则


Shell命令行的书写规则

对Shell命令行基本功能的理解有助于编写更好的Shell程序,在执行Shell命令时多个命令能够在一个命令行上执行,但此时要使用分号(;)分隔命令,比如:

[root@localhost 
root]# ls a* -l;free;df

长Shell命令行能够使用反斜线字符(\)在命令行上扩充,比如:

[root@localhost 
root]# echo “this is \

>long command”

This is long command

注意:

“>”符号是自己主动产生的,而不是输入的。

12-2编写/改动权限及运行Shell程序的步骤


编写Shell程序


运行Shell程序

Shell程序有非常多类似C语言和其它程序设计语言的特征,可是又没有程序语言那样复杂。Shell程序是指放在一个文件里的一系列Linux命令和有用程序。在运行的时候,通过Linux操作系统一个接一个地解释和运行每条命令。首先,来编写第一个Shell程序,从中学习Shell程序的编写、改动权限、运行过程。

12-2-1 
编辑Shell程序

编辑一个内容例如以下的源程序,保存文件名称为date,可将其存放在文件夹/bin下。

[root@localhost 
bin]#vi date

#! /bin/sh

echo “Mr.$USER,Today is:”

echo &date “+%B%d%A”

echo “Wish you a lucky day !”

注意:

#! /bin/sh通知採用Bash解释。假设在echo语句中运行Shell命令date,则须要在date命令前加符号“&”,当中%B%d%A为输入格式控制符。

12-2-2
建立可运行程序

  
 
编辑完该文件之后不能马上运行该文件,需给文件设置可运行程序权限。使用例如以下命令。

[root@localhost 
bin]#chmod +x date

12-2-3 
运行Shell程序

运行Shell程序有以下三种方法:

方法一:

[root@localhost 
bin]#./ date

Mr.root,Today is:

二月 06 星期二

Wish you a lucky day !

方法二:

还有一种运行date的方法就是把它作为一个參数传递给Shell命令:

[root@localhost 
bin]# Bash date

Mr.root,Today is:

二月 06 星期二

Wish you a lucky day !

方法三:

为了在不论什么文件夹都能够编译和运行Shell所编写的程序,即把/bin的这个文件夹加入到整个环境变量中。

详细操作例如以下:

[root@localhost 
root]#export PATH=/bin:$PATH

[root@localhost 
bin]# date

Mr.root,Today is:

二月 06
星期二

Wish you a lucky day !

实例 12-1:编写一个Shell程序mkf,此程序的功能是:显示root下的文件信息,然后建立一个kk的目录,在此目录下建立一个文件aa,改动此文件的权限为可运行。

分析:此Shell程序中须要依次运行下列命令为:

进入root文件夹:cd /root

显示root文件夹下的文件信息:ls –l

新建目录kk: mkdir kk

进入root/kk文件夹:cd kk

新建一个文件aa: 
vi aa  #编辑完毕后需手工保存

改动aa文件的权限为可运行:chmod +x aa

回到root文件夹:cd /root

因此该Shell程序仅仅是以上命令的顺序集合,假定程序名为mkf

[root@localhost 
root]#vi mkf

cd /root

ls –l

mkdir kk

cd kk

vi aa

chmod +x aa

cd /root

12-3在Shell程序中使用的參数


位置參数


内部參数

如同ls命令能够接受文件夹等作为它的參数一样,在Shell编程时相同能够使用參数。Shell程序中的參数分为位置參数和内部參数等。

12-3-1 
位置參数

由系统提供的參数称为位置參数。位置參数的值能够用$N得到,N是一个数字,假设为1,即$1。类似C语言中的数组,Linux会把输入的命令字符串分段并给每段进行标号,标号从0開始。号为程序名字,从1開始就表示传递给程序的參数。如$0表示程序的名字,$1表示传递给程序的第一个參数,以此类推。

12-3-2 
内部參数

上述过程中的$0是一个内部变量,它是必须的,而$1则可有可无,最经常使用的内部变量有$0、$#、$?、$*,它们的含义例如以下。


$0:命令含命令所在的路径。


$#:传递给程序的总的參数数目。


$?:Shell程序在Shell中退出的情况,正常退出返回0,反之为非0值。


$*:传递给程序的全部參数组成的字符串。

实例 12-2:编写一个Shell程序,用于描写叙述Shell程序中的位置參数为:$0、$#、$?、$*,程序名为test1,代码例如以下:

[root@localhost 
bin]#vi test1

#! /bin/sh

echo “Program name is $0”;

echo “There are totally $# parameters passed to this program”;

echo “The last is $?”;

echo “The parameter are $*”;

运行后的结果例如以下:

[root@localhost 
bin]# test1 this is a test program  //传递5个參数

Program name is /bin/test1       
               //给出程序的完整路径和名字

There are totally 5 parameters passed to this program 
//參数的总数

The last is 0                                   
//程序运行效果

The parameters are this is a test program          
//返回由參数组成的字符串

注意:命令不计算在參数内。

实例 12-3:利用内部变量和位置參数编写一个名为test2的简单删除程序,如删除的文件名称为a,则在终端中输入的命令为:test
a

分析:除命令外至少另一个位置參数,即$#不能为0,删除不能为$1,程序设计步骤例如以下。

(1)  
用vi编辑程序

[root@localhost 
bin]#vi test2

#! /bin/sh

if test $# -eq 0

then

echo “Please specify a file!”

else

gzip $1                        
//现对文件进行压缩

mv $1.gz $HOME/dustbin          
//移动到回收站

echo “File $1 is deleted !”

fi

(2)  
设置权限

[root@localhost 
bin]#chmod +x test2

(3) 
执行

[root@localhost 
bin]# test2 a (假设a文件在bin文件夹下存在)

File a is deleted!

12-4在Shell程序中的使用变量


变量的赋值


变量的訪问


变量的输入

 

12-4-1变量的赋值

  
在Shell编程中,全部的变量名都由字符串组成,而且不须要对变量进行声明。要赋值给一个变量,其格式例如以下:

变量名=值

注意:

等号(=)前后没有空格

比如:

x=6

a=”How are you ”

表示把6赋值给变量x,字符串“How are you
”赋值给变量a。

12-4-2 
訪问变量值

假设要訪问变量值,能够在变量前面加一个美元符号“$”,比如:

[root@localhost 
bin]#a=”How are you ”

[root@localhost 
bin]#echo “He juest said:$a”

A is:hello world

一个变量给还有一个变量赋值能够写成:

变量2=$变量1

比如:

x=$i

i++能够写成:

i=$i+1

12-4-3
键盘读入变量值

  
在Shell程序设计中,变量的值能够作为字符串从键盘读入,其格式为:

read 变量

比如:

[root@localhost 
bin]#read str

read为读入命令,它表示从键盘读入字符串到str。

实例 12-4:编写一个Shell程序test3,程序运行时从键盘读入一个文件夹名,然后显示这个文件夹下全部文件的信息。

分析:

存放文件夹的变量为DIRECTORY,其读入语句为:

read DIRECTORY

显示文件的信息命令为:ls –a

[root@localhost 
bin]#vi test3

#! /bin/sh

echo “please input name of directory”

read DIRECTORY

cd $DIRECTORY

ls –l

(2)设置权限

[root@localhost 
bin]#chmod +x test3

(3)运行

[root@localhost 
bin]#./test3

注意:

输入路径时需“/”

实例 12-5:执行程序test4,从键盘读入x、y的值,然后做加法运算,最后输出结果。

(1)用vi编辑程序

[root@localhost 
bin]#vi test4

#! /bin/sh

echo “please input x y”

read x,y

z=`expr $x+$y`

echo “The sum is $z”

(2)设置权限

[root@localhost 
bin]#chmod +x test4

(3)运行

[root@localhost 
bin]#./ test4

45 78

The sum is 123

注意:

表达式total=`expr $total +$num`及num=`expr $num +1`中的符号“`”为键盘左上角的“`”键。

12-5表达式的比較


字符串操作符


逻辑运算符


用test比較的运算符


数字比較符


文件操作符

在Shell程序中,通常使用表达式比較来完毕逻辑任务。表达式所代表的操作符有字符操作符、数字操作符、逻辑操作符、以及文件操作符。当中文件操作符是一种Shell所独特的操作符。由于Shell里的变量都是字符串,为了达到对文件进行操作的目的,于是才提供了文件操作符。

12-5-1
字符串比較

   作用:測试字符串是否相等、长度是否为零,字符串是否为NULL。

经常使用的字符串操作符如表12-1所看到的.。

                       
 表12-1  
经常使用的字符串操作符

   
   
字符串操作符

          
含义及返回值

=

 比較两个字符串是否同样,同样则为“真”

 !=

 比較两个字符串是否不同样,不同则为“真”

  -n

比較两个字符串长度是否大于零,若大于零则为“真”

  -z

比較两个字符串长度是否等于零,若等于零则为“真”

实例 12-6:从键盘输入两个字符串,推断这两个字符串是否相等,如相等输出。

(1)用vi编辑程序

[root@localhost 
bin]#vi test5

#! /bin/Bash

read ar1

read ar2

[ “$ar1” = “$ar2” ]

echo $? #?保存前一个命令的返回码

(2)设置权限

[root@localhost 
bin]#chmod +x test5

(3)运行

[root@localhost 
root]#./ test5

aaa

bbb

1

注意:

”[”后面和”]”前面及等号“=“的前后都应有一个空格;注意这里是程序的退出情况,假设ar1和ar2的字符串是不想等的非正常退出,输出结果为1。

实例 12-7: 比較字符串长度是否大于零

(1)用vi编辑程序

[root@localhost 
bin]#vi test6

#! /bin/Bash

read ar


-n “$ar” ]

echo $?
  //保存前一个命令的返回码

(2)设置权限

[root@localhost 
bin]#chmod +x test6

(3)运行

[root@localhost 
bin]#./ test6

0

注意:

执行结果1表示ar的小于等于零,0表示ar的长度大于零。

12-5-2
数字比較

在Bash Shell编程中的关系运算有别于其它编程语言,用表12-2中的运算符用test语句表示大小的比較。

                        
表12-2 
用test比較的运算符

  
运算符号

          
含            义

-eq

           
相等

-ge

         
大于等于

-le

         
小于等于

-ne

         
不等于

-gt

         
大于

-lt

         
小于

实例 12-8:比較两个数字是否相等

(1)用vi编辑程序

[root@localhost 
bin]#vi test7

#! /bin/Bash

read x,y

if test $x –eq $y

then

echo “$x=$y”

else

echo “$x!=$y”

fi

(2)设置权限

[root@localhost 
bin]#chmod +x test7

(3)运行

[root@localhost 
bin]#./ test7

50 100

50!=100

[root@localhost 
bin]#./ test7

150 150

150= =150

12-5-3
逻辑操作

在Shell程序设计中的逻辑运算符如表12-3所看到的。

   
12-3 
Shell中的逻辑运算符

 运算符号

          
含            义

   
!

 反:与一个逻辑值相反的逻辑值

   
-a

 与(and):两个逻辑值为“是”返回值为“是”,反之为“否”

   
-o

或(or):
两个逻辑值有一个为“是”,返回值就是“是”

实例 12-9:分别给两个字符变量赋值,一个变量赋予一定的值,还有一个变量为空,求两者的与、或操作。

(1)用vi编辑程序

[root@localhost 
bin]#vi test8

#! /bin/Bash

part1 =”1111”

part2 =” ”     #part2为空

[ “$ part1” –a “$ part2”]

echo $?       #保存前一个命令的返回码

[ “$ part1” –o “$ part2”]

echo $?

(2)设置权限

[root@localhost 
bin]#chmod +x test8

(3)运行

[root@localhost 
bin]#./ test8

1

0

12-5-4
文件操作

文件測试操作表达式一般是为了測试文件的信息,一般由脚本来决定文件是否应该备份、复制或删除。因为test关于文件的操作符有非常多,在表12-4中仅仅列举一些经常使用的操作符。

表12-4  
文件測试操作符

   
运算符号

          
含            义

 -d

 对象存在且为文件夹返回值为“是”

 -f

 对象存在且为文件返回值为“是”

-L

 对象存在且为符号连接返回值为“是”

 -r

 对象存在且可读则返回值为“是”

 -s

 对象存在且长度非零则返回值为“是”

 -w

 对象存在且且可写则返回值为“是”

 -x

 对象存在且且可运行则返回值为“是”

实例 12-10:推断zb文件夹是否存在于/root下。

(1)用vi编辑程序

[root@localhost 
bin]#vi test9

#! /bin/Bash

[ -d /root/zb ]

echo $?   
#保存前一个命令的返回码

(2)设置权限

[root@localhost 
bin]#chmod +x test9

(3)运行

[root@localhost 
bint]#./ test9

(4)在/root加入zb文件夹

[root@localhost  bin]#mkdir zb

(5)运行

[root@localhost  bin]#./test9

0

注意:

执行结果是返回參数“$?”,结果1表示推断的文件夹不存在,0表示推断的文件夹不存在。

实例 12-11:编写一个Shell程序test10,输入一个字符串,假设是文件夹,则显示文件夹下的信息,如为文件显示文件的内容。

(1)用vi编辑程序

[root@localhost 
bin]#vi test10

#! /bin/Bash

echo “Please enter the directory name or file name”

read DORF

if [ -d $DORF ]

then

ls $DORF

elif [ -f $DORF ]

then

cat $DORF

else

echo “input error! ”

fi

(2)设置权限

[root@localhost 
bin]#chmod +x test10

(3)运行

[root@localhost 
bin]#./ test10

12-6循环结构语句


Shell的循环语句

Shell常见的循环语句有for循环、while循环语句和until循环。

12-6-1 
for循环

语法:

for
变量 in
列表

do

操作

done

注意:

变量要在循环内部用来指列表其中的对象。

列表是在for循环的内部要操作的对象,能够是字符串也能够是文件,假设是文件则为文件名称。

实例 12-12:在列表中的值:a,b,c,e,I,2,4,6,8用循环的方式把字符与数字分成两行输出。

(1)用gedit编辑脚本程序test11

[root@localhost 
bin]#gedit test11

#! /bin/Bash

for i in a,b,c,e,I
 2,4,6,8

do

echo $i

done

(2)设置权限

[root@localhost 
bin]#chmod +x test11

(3)运行

[root@localhost 
bin]#./ test11

a,b,c,e,i

2,4,6,8

注意:

在循环列表中的空格可表示换行。

实例 12-13:删除垃圾箱中的全部文件。

分析:在本机中,垃圾箱的位置是在$HOME/.Trash中,因而是在删除$HOME/.Trash列表其中的全部文件,程序脚本例如以下。

(1)用gedit编辑脚本程序test12

[root@localhost 
bin]#gedit test12

#! /bin/Bash

for i in $HOME/.Trash/*

do

rm $ i

echo “$ i has been deleted!”

done

(2)设置权限

[root@localhost 
bin]#chmod +x test12

(3)运行

[root@localhost 
bin]#./ test12

/root/.Trash/abc~ has been deleted!

/root/.Trash/abc1 has been deleted!

实例 12-14:求从1~100的和。

(1)用gedit编辑脚本程序test13

[root@localhost 
bin]#gedit test13

#! /bin/Bash

total =0

for((j=1;j<=100;j++));

do

total=`expr $total + $j`

done

echo “The result is $total”

(2)设置权限

[root@localhost 
bin]#chmod +x test13

(3)运行

[root@localhost 
bin]#./ test13

The result is 5050

注意:

for语句中的双括号不能省,最后的分号可有可无,表达式total=`expr $total + $j`的加号两边的空格不能省,否则会成为字符串的连接。

12-6-2 while循环

语法:

while 表达式

do

操作

done

仅仅要表达式为真,do和done之间的操作就一直会进行。

实例 12-15:用while循环求1~100的和。

(1)用gedit编辑脚本程序test14

[root@localhost 
bin]#gedit test13

total =0

num=0

while((num<=100));

do

total=’expor $total +$ num’

done

echo “The result is $total”

(2)设置权限

[root@localhost 
bin]#chmod +x test14

(3)运行

[root@localhost 
bin]#./ test14

The result is 5050

12-6-3 until循环

语法:

until 表达式

do

操作

done

反复do和done之间的操作直到表达式成立为止。

实例 12-16:用until循环求1~100的和。

(1)用gedit编辑脚本程序test15

[root@localhost 
bin]#gedit test15

total =0

num=0

until [$sum –gt 100]

do

total=’expor $total +$ num’

num=’expr $num + 1’

done

echo “The result is $total”

(2)设置权限

[root@localhost 
bin]#chmod +x test15

(3)运行

[root@localhost 
bin]#./ test15

The result is 5050

12-7条件结构语句


Shell的条件结构语句

Shell程序中的条件语句主要有if语句与case语句。

12-7-1 
if语句

语法:

if
表达式1 
then

操作

elif表达式2 
then

操作

elif表达式3 
then

操作

……

else

操作

fi

Linux里的if的结束标志是将if反过来写成fi;而elif事实上是else
if的缩写。当中,elif理论上能够有无限多个。

实例 12-17:用for循环求1~100的和。

(1)用gedit编辑脚本程序test16

[root@localhost 
bin]#gedit test16

for((j=0;j<=10;j++))

do

if(($j%2==1))

then

echo “$j”

fi

done

(2)设置权限

[root@localhost 
bin]#chmod +x test16

(3)运行

[root@localhost 
bin]#./ test16

13579

12-7-2 
case语句

语法:

case
表达式 in

值1|值2)

操作;;

值3|值4)

操作;;

值5|值6)

操作;;

*)

操作;;

esac

case的作用就是当字符串与某个值同样是就运行那个值后面的操作。假设同一个操作对于多个值,则使用“|”将各个值分开。在case的每个操作的最后面都有两个“;;”分号是必需的。

实例 12-18:Linux是一个多用户操作系统,编写一程序依据不同的用户登录输出不同的反馈结果。

(1)用vi编辑脚本程序test17

[root@localhost 
bin]#gedit test17

#!/bin/sh

case $USER in

beechen)

echo “You are beichen!”;;

liangnian)

echo “You are liangnian”;        //注意这里仅仅有一个分号

echo “Welcome !”;;            //这里才是两个分号

root)

echo “You are root!”;echo “Welcome !”;;

//将两命令写在一行,用一个分号作为分隔符

*)

echo “Who are you?$USER?”;;

easc

(2)设置权限

[root@localhost 
bin]#chmod +x test17

(3)运行

[root@localhost 
bin]#./ test17

You are root

Welcome!

12-8在Shell脚本中使用函数

  


Shell的函数

Shell程序也支持函数。函数能完毕一特定的功能,能够反复调用这个函数。

函数格式例如以下:

函数名( )

{

函数体

}

函数调用方式为

函数名 
參数列表

实例 12-19:编写一函数add求两个数的和,这两个数用位置參数传入,最后输出结果。

(1)编辑代码

[root@localhost 
bin]#gedit test18

#!/bin/sh

add()

{

a=$1

b=$2

z=’expr $a + $b’

echo “The sum is $z”

}

add $1 $2

(2)设置权限

[root@localhost 
bin]#chmod +x test18

(3)运行

[root@localhost 
bin]#./ test18  10  20

The sum is 30

注意:

函数定义完毕后必须同一时候写出函数的调用,然后对此文件进行权限设定,在运行此文件。

12-9在Shell脚本中调用其它脚本


Shell脚本的调用

在Shell脚本的运行过程中,Shell脚本支持调用还有一个Shell脚本,调用的格式为:

程序名

实例 12-20:在Shell脚本test19中调用test20。

(1)调用test20

#test19脚本

#!/bin/sh

echo “The main name is $0”

./test20

echo “The first string is $1”

#test20脚本

#!/bin/sh

echo “How are you $USER?”

(2)设置权限

[root@localhost 
bin]#chmod +x test19

[root@localhost 
bin]#chmod +x test20

(3)运行

[root@localhost 
bin]#./ test19 abc123

The main name is ./test19

How are you root?

the first string is abc123

注意:

1)在Linux编辑中命令区分大写和小写字符。

2)在Shell语句中增加必要的凝视,以便以后查询和维护,凝视以#开头。

3)对Shell变量进行数字运算时,使用乘法符号“*”时,要用转义字符“\”进行转义。

4)因为Shell对命令中多余的空格不进行不论什么处理,因此程序猿能够利用这一特性调整程序缩进,达到增强程序可读性效果。

5)在对函数命名时最好能使用有含义且能easy理解的名字,即使函数名可以比較准确地表达函数所完毕的任务。同一时候建议对于较大的程序要建立函数名和变量命名对比表。

12-10本章小结

本章解说了Linux下Shell脚本的定义和相关Shell脚本编写的基础,这些基础知识是学习Shell脚本编程的关键。接着解说了Shell
脚本的运行方式和Shell脚本的常见流程控制,为Shell脚本的编程做了准备。

课后习题

1.  
选择题

(1) 
下列说法中正确的是( )。

A.安装软件包fctix-3.4.tar.bz2,要按顺序使用./configure;make;make
install;tar命令

B.挂载U盘,mount /dev/sda 
/mnt/u  -o  iocharset=gb2312

C.显示变量PS1的值用命令 echo 
PS1

D.用命令./abc与sh abc运行Shell脚本abc,所得的结果并不同样

(2) 
一个Bash Shell脚本的第一行是什么()。

A. #!/bin/Bash  B.
#/bin/Bash  C. #/bin/csh   D.
/bin/Bash

(3) 
在Shell脚本中,用来读取文件内各个域的内容并将其赋值给Shell变量的命令是( )。

A. fold
         B. join          C. tr           
 D. read

(4) 
下列变量名中有效的Shell变量名是()。

A. -2-time
      B. _2$3        C. trust_no_1
     D. 2004file

(5) 
下列对Shell变量FRUIT操作,正确的是( )。

A. 为变量赋值:$FRUIT=apple     B.
显示变量的值:fruit=apple

C. 显示变量的值:echo $FRUIT    D.
推断变量是否有值:[ -f “$FRUIT” ]

(6) 
在Fedora 12系统中,下列关于Shell脚本程序说法不对的是( )。

A. Shell脚本程序以文本的形式存储

B. Shell脚本程序在执行前须要进行编译

C. Shell脚本程序由解释程序解释运行

D. Shell 脚本程序主要用于系统管理和文件操作,它可以方便自如地处理大量反复

性的系统工作

(7) 
在Shell编程中关于$2的描写叙述正确的是( )。

A.
程序后携带了两个位置參数

B.
宏替换

C.
程序后面携带的第二个位置參数

D
携带位置參数的个数

E
用$2引用第二个位置參数

(8) 
在Fedora 12系统中,“run.sh”是Shell运行脚本,在运行./run.sh file1 file2 file3的命令的过程中,变量$1的值为()。

A. run.sh     
B. file1      C. file2       D. file3

2.  
填空题

(1) 
在Shell编程时,使用方括号表示測试条件的规则是           

(2) 
编写的Shell程序执行前必须赋予该脚本文件        
权限。

3.  
简答题

(1) 
用Shell编程,推断一文件是不是字符设备文件,假设是将其复制到 /dev
文件夹下。

(2) 
在根文件夹下有四个文件m1.txt,m2.txt,m3.txt,m4.txt,用Shell编程,实现自己主动创建m1,m2,m3,m4四个文件夹,并将m1.txt,m2.txt,m3.txt,m4.txt四个文件分别复制到各自对应的文件夹下。

(3) 
某系统管理员需每天做一定的反复工作,请依照下列要求,编制一个解决方式:


在下午4 :50删除/abc文件夹下的所有子文件夹和所有文件;


从早8:00~下午6:00每小时读取/xyz文件夹下x1文件里每行第一个域的所有数据增加到/backup文件夹下的bak01.txt文件内;


每逢星期一下午5:50将/data文件夹下的全部文件夹和文件归档并压缩为文件:backup.tar.gz;


在下午5:55将IDE接口的CD-ROM卸载(如果:CD-ROM的设备名为hdc);


在早晨8:00前开机后启动。

(4) 
请用Shell编程来实现:当输入不同的选择时,运行不同的操作,如:输入start
開始启动应用程序myfiles,输入stop时,关闭myfiles,输入status时,查看myfiles进程,否则运行*)显示“EXIT!”并退出程序。

(5) 
编写一个Shell程序,此程序的功能是:显示root下的文件信息,然后建立一个abc的目录,在此目录下建立一个文件k.c,改动此文件的权限为可运行。

(6) 
编写一个Shell程序,挂载U盘,在U盘中根文件夹下全部.c文件复制到当前文件夹,然后卸载U盘。

(7) 
编写一个Shell程序,程序运行时从键盘读入一个文件名称,然后创建这个文件。

(8) 
编写一个Shell程序,键盘输入两个字符串,比較两个字符串是否相等。

(9) 
编写三个Shell程序,分别用for、while、与until求从2+4+…+100的和。

(10)
编写一个Shell程序,键盘输入两个数及+、-、*、与/中的任一运算符,计算这两个数的运算结果。

(11)
编写两个Shell程序kk及aa,在kk中输入两个数,调用aa计算计算这两个数之间奇数的和。

(12)
编写Shell程序,能够挂载U盘,也可挂载Windows硬盘的分区,并可对文件进行操作。

(13)
编写4个函数分别进行算术运算+、-、*、/,并编写一个菜单,实现运算命令。

课程实训

实训内容:编写一个Shell程序,呈现一个菜单,有0-5共6个命令选项,1为挂载U盘,2为卸载U盘,3为显示U盘的信息,4把硬盘中的文件复制到U盘,5把U盘中的文件复制到硬盘中,选0为退出。

程序分析:把此程序分成题目中要求的6大功能模块,另外加一个菜单显示及选择的主模板。

(1)      
编辑代码

[root@localhost 
bin]#vi test19

#!/bin/sh

#mountusb.sh

#退出程序函数

quit()

{

clear

echo “*******************************************************************”

echo  “***           thank you to use,Good bye!           
****”

exit 0

}

#载入U盘函数

mountusb()

{

clear

#在/mnt下创建usb文件夹

mkdir /mnt/usb

#查看U盘设备名称

/sbin/fdisk –l |grep /dev/sd

echo –e “Please Enter the device name of usb as shown above:\c”

read PARAMETER

mount /dev/$PARAMETER /mnt/usb

}

#卸载U盘函数

umountusb()

{

clear

ls -la /mnt/usb

}

#显示U盘信息函数

display()

{

clear

umount /mnt/usb

}

#拷贝硬盘文件到U盘函数

cpdisktousb()

{

clear

echo –e “Please Enter the filename to be Copide (under Current directory):\c”

read FILE

echo “Copying,please wait!...”

cp $FILE /mnt/usb

}

#拷贝U盘函数到硬盘文件

cpusbtodisk()

{

clear

echo -e “Please Enter the filename to be Copide in USB:\c”

read FILE

echo “Copying ,Please wait!...”

cp /mnt/usb/$FILE .  #点(.)表示当前路径

}

clear

while true

do

echo “=====================================================================”

echo “*** 
          LINUX USB MANAGE PROGRAM                    
***”

echo 
“              1-MOUNT USB                                   

echo 
“              2-UNMOUNT USB                                 

echo 
“              3-DISPLAY USB INFORMATION         
            ”

echo 
“              4-COPY FILE IN DISK TO USB                    

echo 
“              5-COPY FILE IN USB TO DISK                    

echo 
“              0-EXIT                                        

echo “=====================================================================”

echo –e “Please Enter a Choice(0-5):\c”

read CHOICE

case $CHOICE in

1) 
mountusb

2) 
unmountusb

3) 
display

4) 
cpdisktousb

5) 
cpusbtodisk

0) 
quit

*) 
echo “Invalid Choice!Corrent Choice is (0-5)”

sleep 4

clear;;

esac

done

(2)改动权限

[root@localhost 
bin]#chmod +x test19

(3)程序运行结果

[root@localhost 
bin]#./ test19

项目实践

这段时间陈飞在学习Linux下的Shell
编程,感觉Shell
编程和C语言非常相似。王project师今天来看陈飞,顺便问一下陈飞的学习情况。陈飞就和他说了自己对Shell编程的看法。王project师听了后,笑着说,“一样不一样,你编个程序不久明确了吗。”“那编什么程序呢”。陈飞问道。“就俄罗斯方块吧”,王project师说。“俄罗斯方块大家都会玩,并且你能够在网上找到用C语言编写的程序,你用Shell编程实现,和C语言版的对照一下,不就明确了它们之间的不同了吗”。王project师走了,留下了陷入沉思的陈飞。他能完毕吗?

Shell脚本编程具体解释的更多相关文章

  1. Shell脚本编程30分钟入门

    Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...

  2. Linux shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  3. 【Linux】Shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  4. Shell脚本编程总结及速查手册

    Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算符/if语句/循环控制/… 但在开始之前, 我想先理清Shell语言与Shell之间的关系. ...

  5. 30分钟快速学习Shell脚本编程

    什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do touch ...

  6. Shell脚本编程学习入门 01

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...

  7. Shell脚本编程(一):初识shell script

    Shell简介 Shell是一个命令解释器,它是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核 ...

  8. 08 bash特性--shell脚本编程入门

    shell脚本编程入门 编程语言介绍 编程语言分为:机械语言.汇编语言和高级语言: 计算机能识别的语言为机械语言,而人类能学习的并且能够方便掌握的为高级语言,所以,我们所编写的程序就要通过编译来转换成 ...

  9. SHELL脚本编程的常识和VI常用技巧

    来源:http://mprc.pku.edu.cn/mentors/training/TrainingCourses/material/ShellProgramming.HTM#_Toc3751808 ...

随机推荐

  1. Python单元测试:unittest使用简介

    一.概述 本文介绍python的单元测试框架unittest,这是Python自带的标准模块unittest.unittest是基于java中的流行单元测试框架junit设计的,其功能强大且灵活,对于 ...

  2. poj 3356 AGTC(线性dp)

    题目链接:http://poj.org/problem?id=3356 思路分析:题目为经典的编辑距离问题,其实质为动态规划问题: 编辑距离问题定义:给定一个字符串source,可以对其进行复制,替换 ...

  3. 开源html5_kiwijs_helloworld

    本次须要的下载文件已经共享出来 网盘地址 由于我使用的是黑苹果系统, window我就无视了. 开发工具使用 网盘里的 dmg :Sublime Text 打开开发工具后在helloworld中找到 ...

  4. Maven导入时,Cannot change version of project facet Dynamic Web Module to 3.0.

    今天手贱,在eclipse里面把项目删掉了,重新maven导入时,报出Cannot change version of project facet Dynamic Web Module to 3.0. ...

  5. 通过SqlHelper实现登录

    1.建立解决方案:. 首先创建windows窗体应用程序,然后拖出登录界面 2. 写配置文件App.config:     <configuration>         <conn ...

  6. Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器

    Asp.Net MVC4.0 官方教程 入门指南之二--添加一个控制器 MVC概念 MVC的含义是 “模型-视图-控制器”.MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程 ...

  7. Visual Studio Tools for Unity安装及使用

    Visual Studio Tools for Unity安装及使用 转载自:CSDN 晃了一下,10.1到现在又过去两个月了,这两个月什么也没有学,整天上班下班,从这周末开始拾起unity,为了年后 ...

  8. centos7/redhat7 将网卡名字改成eth样式的方法

    方法/步骤    1. 编辑 /etc/sysconfig/grub 找到“GRUB_CMDLINE_LINUX”这一行 

  9. Shell Script(1)----variable compare

    PS:在学习python的时间里,抽空复习自己学习的Linux下的shell脚本知识点 1.数据类型 学习一门语言,比较关心其数据的表示方式,以及数据的类型,这里首先看一个bash shell的脚本 ...

  10. 自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版

    Nginx比apache要好,优点很多,随便去搜寻引擎找一下就能找到一大把资料,这不是我们讨论的重点,我们的重点是自己做一个运行组合!     為何我不從網上下載一個別人已經封裝好的現成的版本呢?因為 ...