《第3章Shell编程.ppt》由会员分享,可在线阅读,更多相关《第3章Shell编程.ppt(41页珍藏版)》请在三一文库上搜索。
1、1,编写、权限修改和执行shell程序的步骤,Shell编程有很多类似C语言和其他程序设计语言的特征,但是又没有编程语言那样复杂。Shell程序是指放在一个文件中的一系列Linux命令和实用程序,在执行的时候,通过Linux操作系统一个接着一个地解释和执行每条命令。,2,编写、权限修改和执行shell程序的步骤,1. 编辑shell程序 编辑一个内容如下的源文件,文件名为date,可将其存放在目录/bin下。 rootlocalhost bin#vi date #!/bin/sh echo “Mr.$USER,Today is:“ echo &date “+%B%d%A“ echo “Whis
2、h you a lucky day !“ 注意:#!/bin/sh通知采用bash解释,在echo语句中执行shell命令date,在date命令前加符号“&”,%B%d%A为输出格式控制符。,3,编写、权限修改和执行shell程序的步骤,2. 建立可执行的二进制程序 编辑完该文件之后不能立即执行该文件,需给文件设置可执行权限。使用如下命令: chmod +x date,4,编写、权限修改和执行shell程序的步骤,3. 执行shell程序 方法(1) rootlocalhost bin# ./date Mr.root,Today is: 二月06星期二 Wish you a lucky da
3、y ! 方法(2) 另外一种执行date的方法就是把它作为一个参数传给shell命令: rootlocalhost bin# bash date Mr.root,Today is: 二月06星期二 Wish you a lucky day !,5,编写、权限修改和执行shell程序的步骤,例3.1 编写一个shell程序,此程序的功能是:显示root下的文件信息,然后建立一个kk的文件夹,在此文件夹下新建一个文件aa,修改此文件的权限为可执行。 分析:此shell程序中需要依次执行命令: 进入root目录:cd /root 显示root目录下的文件信息:ls l 新建文件夹kk:mkdir k
4、k 进入root/kk目录:cd kk 新建一个文件aa:vi aa #编辑完成后需手工保存 修改aa文件的权限为可执行:chmod +x aa 回到root目录:cd /root,6,编写、权限修改和执行shell程序的步骤,shell程序只是以上命令的顺序集合,假定程序名为mkf。 rootlocalhost root#vi mkf cd /root ls l mkdir kk cd kk vi aa chmod +x aa cd /root,7,在shell程序中使用的参数,1.位置参数 由系统提供的参数称为位置参数。位置参数的值可以用$N得到,N是一个数字,如果为1,即$1.类似C语言
5、中的数组,Linux会把输入的命令字符串分段并给每段进行标号,标号从0开始。第0号为程序名字,从1开始就表示传递给程序的参数。如$0表示程序的名字,$1表示传递给程序的第一个参数,以此类推。,8,在shell程序中使用的参数,2.内部参数 上述过程中的$0是一个内部变量,它是必须的,而$1则可有可无,最常用的内部变量有$0、$#、$?、$*,它们的含义如下: $0 :命令含命令所在的路径 $# :传递给程序的总的参数数目 $? :shell程序在shell中退出的情况,正常退出返回0,反之为非0值 $* :传递给程序的所有参数组成的字符串,9,在shell程序中使用的参数,例3.2 编写一个s
6、hell程序,用于描述shell程序中的位置参数$0、$#、$?、$*,程序名为test1,代码如下: rootlocalhost 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 parameters are $*“; 注意:命令不计算在参数内。,10,在shell程序中使用变量,1.变量的赋值 在shell编程中,所有的变量名都由字符串组成,并且您不需
7、要对变量进行声明。 格式:变量名=值 注意:必须保证等号(=)前后没有空格。 例: x=6 a=“hello world“,11,在shell程序中使用变量,2.访问变量值 如果要访问变量值,可以在变量前面加一个美元符号”$”,如: a=“hello world“ echo “A is: $a“ 一个变量给另一个变量赋值可以写成: 变量2=$变量1 例如: x=$i i+可以写成:i=$i+1,12,在shell程序中使用变量,3.键盘读入 在shell程序设计中,变量的值可以作为字符串从键盘读入,其格式为: read 变量 例如: read str read为读入命令,它表示从键盘读入字符串
8、到str,13,在shell程序中使用变量,例3.4 编写一个shell程序,程序执行时从键盘读入一个目录名,然后显示这个目录下所有文件的信息。 分析:设存放目录的变量为DIRECTORY,其读入语句为: read DIRECTORY 显示文件的信息命令为: ls al rootlocalhost bin#vi test3 #!/bin/sh echo “please input name of directory “ read DIRECTORY cd $DIRECTORY ls l (2)设置权限: rootlocalhost bin#chmod +x test3 (3)执行: rootl
9、ocalhost bin# ./test2,14,在shell程序中使用变量,例3.5 运行程序test3,从键盘读入x、y的值,然后做加法运算,最后输出结果。 (1)用vi编辑程序 rootlocalhost bin#vi test3 #!/bin/sh read x y z=expr $x + $y echo “The sum is $z“ (2)设置权限: rootlocalhost bin#chmod +x test3 (3)执行: rootlocalhost bin# ./test3 45 78 The sum is 123,15,表达式的比较,1.字符串比较 作用:测试字符串是否相
10、等、长度是否为零,字符串是否为NULL。 常用的字符串操作符:,16,表达式的比较,例3.6 从键盘读入两个字符串,判断这两个字符串是否相等,如相等输出。 (1)用vi编辑程序 rootlocalhost bin#vi test4 #!/bin/bash read ar1 read ar2 “$ar1“ = “$ar2“ echo $? #保存前一个命令的返回码 (2)设置权限: rootlocalhost bin#chmod +x test4 (3)执行: rootlocalhost root# ./test4 aaa bbb 1,注意: “”后面和“”前面及等号“=”的前后都应有一空格;,
11、17,表达式的比较,例3.7 比较字符串长度是否大于零。 (1)用vi编辑程序 rootlocalhost bin#vi test5 #!/bin/bash read ar -n “$ar“ echo $? #保存前一个命令的返回码 (2)设置权限: rootlocalhost bin#chmod +x test5 (3)执行: rootlocalhost root# ./test5 0,注意: 运行结果1表示ar的小于等于零,0表示ar的长度大于零。,18,表达式的比较,2.数字比较 在bash shell编程中的关系运算有别于其他编程语言。,19,表达式的比较,例38 比较两个数字是否相等
12、。 (1)用vi编辑程序 rootlocalhost bin#vi test6 #!/bin/bash read x y if test $x -eq $y then echo “$x= =$y” else echo “$x!=$y” fi (2)设置权限: rootlocalhost bin#chmod +x test6,(3)执行: rootlocalhost bin# ./test6 50 100 50!=100 rootlocalhost bin# ./test6 150 150 150= =150,20,表达式的比较,3.逻辑操作 逻辑运算符号:,21,表达式的比较,例3.9 一个变
13、量赋予一定的值,另一个为空,求两者的与、或。 (1)用vi编辑程序 rootlocalhost bin#vi test7 #!/bin/bash part1 =“1111“ part2 =“ #part2为空 “$part1“ -a “$part2“ echo $? #保存前一个命令的返回码 “$part1“ -o “$part2“ echo $? (2)设置权限: rootlocalhost bin#chmod +x test7 (3)执行: rootlocalhost bin# ./test7 1 0,22,表达式的比较,4.文件操作 文件测试表达式通常是为了测试文件的信息,一般由脚本来决
14、定文件是否应该备份、复制或删除。 常用操作符:,23,表达式的比较,例3.10 判断zb目录是否存在/root下。 (1)用vi编辑程序 rootlocalhost bin#vi test8 #!/bin/bash -d /root/zb echo $? #保存前一个命令的返回码 (2)设置权限: rootlocalhost bin#chmod +x test8 (3)执行: rootlocalhost bint# ./test8 1 (4) 在/root添加zb目录 rootlocalhost bin#mkdir zb (5)执行: rootlocalhost bin# ./test8 0,
15、注意: 运行结果1表示判断的目录不存在,0表示判断的目录存在。,24,表达式的比较,例3.11 输入一个字符串,如果是目录,则显示目录下的信息,如为文件显示文件的内容。 rootlocalhost bin#vi test9 #!/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,25,循环结构语句,1.for 循环 语法: for 变量 i
16、n 列表 do 操作 done 变量是要在循环内部用来指代列表中的对象。 列表是在for循环的内部要操作的对象,可以是字符串也可以是文件,如果是文件则为文件名。,26,循环结构语句,例3.12 在列表中的值:a,b,c,e,i,2,4,6,8用循环的方式把字符与数字分成两行输出。 (1)用gedit编辑脚本程序test4 rootlocalhost root# gedit test9 #!/bin/sh for i in a,b,c,e,i 2,4,6,8 do echo $i done (2)设置权限: rootlocalhost bin#chmod +x test9 (3)执行: root
17、localhost bin# ./test9 a,b,c,e,i 2,4,6,8,注意:在循环列表中的空格可表示换行。,27,循环结构语句,例:删除垃圾箱中的所有文件 分析:在本机中拉圾箱的位置在$HOME/.Trash中,因而是删除$HOME/.Trash列表中的所有文件,程序脚本如下: (1)用gedit编辑脚本程序test10 rootlocalhost bin# gedit test10 #!/bin/sh for i in $HOME/.Trash/* do rm $i echo “$i has been deleted!“ done (2)设置权限: rootlocalhost b
18、in#chmod +x test10 (3)执行: rootlocalhost bin# ./test10 /root/.Trash/abc has been deleted! /root/.Trash/abc1 has been deleted!,28,循环结构语句,例:求从1到100的和。 (1)用gedit编辑脚本程序test11 rootlocalhost bin# gedit test11 #!/bin/sh total=0 for (j=1;j=100;j+); do total=expr $total + $j done echo “The result is $total“ (
19、2)设置权限: rootlocalhost bin#chmod +x test11 (3)执行: rootlocalhost bin# ./test11 The result is 5050,注意:for语句中的双括号不能省,最后的分号可有可无,表达式total=expr $total + $j的加号两边的空格不能省,否则会成为字符串的连接。,29,循环结构语句,2.while循环 语法: while 表达式 do 操作 done 只要while表达式为真,do和done之间的操作就一直会进行。,30,循环结构语句,例:用while循环求1到100的和。 (1)用gedit编辑脚本程序test
20、12 rootlocalhost bin#gedit test12 total=0 num=0 while(num=100);do total=expr $total + $num (num+=1) done echo “The result is $total“ (2)设置权限: rootlocalhost bin#chmod +x test12 (3)执行: rootlocalhost bin# ./test12 The result is 5050,31,循环结构语句,3.until循环 语法: until 表达式 do 操作 done 重复do和done之间的操作直到表达式成立为止。,
21、32,循环结构语句,例:用until循环求1到100的和。 (1)用gedit编辑脚本程序test13 rootlocalhost bin#gedit test13 total=0 num=0 until $num -gt 100 do total=expr $total + $num num=expr $num + 1 done echo “The result is $total“ (2)设置权限: rootlocalhost bin#chmod +x test13 (3)执行: rootlocalhost bin#./test13 The result is 5050,33,条件结构语句
22、,1.if语句 语法: if 表达式1 then 操作 elif 表达式2 then 操作 elif 表达式3 then 操作 else 操作 fi Linux里的if的结束标志是将if反过来写成fi;而elif其实是else if的缩写 其中elif理论上可以有无限多个。,34,条件结构语句,例:用for循环输出1到10间的奇数。 (1)用gedit编辑脚本程序test14 rootlocalhost bin#gedit test14 for(j=0;j=10;j+) do if($j%2=1) then echo “$j“ fi done (2)设置权限: rootlocalhost bi
23、n#chmod +x test14 (3)执行: rootlocalhost bin#./test14 13579,35,条件结构语句,2 case语句 语法: case 字符串 in 值1|值2) 操作; 值3|值4) 操作; 值5|值6) 操作; *) 操作; esac case的作用就是当字符串与某个值相同是就执行那个值后面的操作。如果同一个操作对于多个值,则使用“|“将各个值分开。在case的每一个操作的最后面都有两个“;“,分号是必须的。,36,条件结构语句,例:Linux是一个多用户操作系统,编写一程序根据不同的用户登录输出不同的反馈结果。 (1)用vi编辑脚本程序test15 r
24、ootlocalhost bin#vi test15 #!/bin/sh case $USER in beichen) echo “You are beichen!“; liangnian) echo “You are liangnian“; /注意这里只有一个分号 echo “Welcome!“; /这里才是两个分号 root) echo “You are root! “; echo “Welcome!“; /将两命令写在一行,用一个分号作为分隔符 *) echo “Who are you?$USER?“; esac,37,条件结构语句,(2)设置权限: rootlocalhost bin#
25、chmod +x test15 (3)执行: rootlocalhost bin#./test15 You are root Welcome!,38,在shell脚本中使用函数,shell程序也支持函数。函数能完成一个特定的功能,可以重复调用这个函数。 函数格式如下: 函数名( ) 函数体 函数调用方式为: 函数名 参数列表,39,在shell脚本中使用函数,例:编写一函数add求两个数的和,这两个数用位置参数传入,最后输出结果。 (1)编辑代码 rootlocalhost bin#vi test16 #!/bin/sh add( ) a=$1 b=$2 z=expr $a + $b echo
26、 “The sum is $z“ add $1 $2 (2)修改权限 rootlocalhost bin#chmod +x test16 (3)程序运行结果 rootlocalhost bin# ./test16 10 20 The sum is 30,注意:函数定义完成后必须同时写出函数的调用,然后对此文件进行权限设定,再执行此文件。,40,在shell脚本中调用其他shell脚本,在shell脚本的执行过程中,shell脚本支持调用另一个shell脚本,调用的格式为: 程序名 例:在shell脚本test17中调用test18 (1)编辑代码 #test17脚本 #!/bin/sh ech
27、o “The main name is $0“ ./test18 echo “the first string is $1“ #test18脚本 #!/bin/sh echo “How are you $USER?“ (2)修改权限 rootlocalhost bin#chmod +x test17 rootlocalhost bin#chmod +x test18,(3)程序运行结果 rootlocalhost bin# ./test17 abc123 The main name is ./test17 How are you root? the first string is abc123,41,在shell脚本中调用其他shell脚本,注意: (1)在Linux编辑中命令区分大小写字符。 (2)在shell语句中加入必要的注释,以便以后阅读和维护,注释以#开头。 (3)对shell变量进行数字运算时,使用乘法符号“*“时,要用转义字符“进行转义。 (4)由于shell对命令中多余的空格不进行任何处理,因此程序员可以利用这一特性调整程序缩进,达到增强程序可读性的效果。 (5)在对函数命名时最好能使用有含义且容易理解的名字,即使函数名能够比较准确地表达函数所完成的任务。同时建议对于较大的程序要建立函数命名和变量命名对照表。,
链接地址:https://www.31doc.com/p-2577292.html