版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十一章 shell程序设计,主要内容,11.1 shell概述 11.2 shell变量 11.3 shell的控制结构 11.4 shell应用实例 11.5 小结,shell是一种命令语言,同时又是一种程序设计语言。 shell的语言处理能力,使得用户能够方便地定义各种变量、参数,并使用各种控制语句编写复杂的命令程序完成多种工作。 本章介绍shell、shell程序设计语言、shell的运行环境及shell程序的实例。,11.1 shell概述,11.1.1 什么是shell shell是一种命令解释程序,shell解释用户输入的命令行,提交系统内核处理,并将结果返回给用户。一旦用户注册
2、到系统后,shell就被系统装入内存,并一直运行到用户退出系统之止;而一般命令仅当被调用时,才由系统装入内存执行。,shell本身也是一种可编程的程序设计语言。用shell写的程序(shell脚本)相当于dos/windows下的批处理文件,它可以简单到只有一条命令,也可以复杂到包括大量循环、条件语句、数学运算、控制结构,也可以是介于两者之间的程序。,11.1.2 shell程序语言的特点 shell允许通过编程来完成复杂的功能处理,但其作为语言与高级语言相比较具有不同的特点: (1) shell是解释性的,多数高级语言是编译性的; (2) shell语言与高级语言处理的对象不同; (3) s
3、hell与系统有密切的关系; (4) shell易编写、调试、灵活性较强,但速度低; (5) shell作为命令级语言,命令组合功能很强。,11.1.3 bash的特点 shell有两种主要语法类型: Bourne shell和C shell,彼此不兼容。这里,我们再着重介绍一下bash的特点: (1) 自动补全功能 假设要输入的命令很长,或者命令后面要给的文件名很长。这个时候只要按一个Tab键,bash就会在可能的命令或文件名里面找寻匹配的命令,找到的话就会自动帮你补齐。,(2) 命令行编辑程序 bash的命令行编辑是在提示符下,可对未执行的命令字符任意地修改。 (3) 命令历史(comma
4、nd history) 所谓的命令历史就是把曾经输入过的命令记录起来,方便日后的查询与使用。只要按向上键就可以调出前一个命令,再按一次向上键就可以调出更前一个命令,依此类推,用向下键可以回到下个命令,所以用上、下键就可以选择以前输入过的命令。,11.1.4 Shell程序的创建与执行,用任一文本编辑器创建shell文件 (xxx)(例如: gedit xxx) 将shell文件改为可执行文件(例如:$chmod u+x xxx) 执行shell文件(例如:$./ xxx),11.1.5 Shell程序示例,在/home/test文件夹下运行“附件”中“文本编辑器”程序 gedit 在新建空白文
5、档中输入如下内容:datepwdls 保存文件到/home/test /xxx中 修改文件权限,运行“系统工具”中“终端”,输入:chmod u+x xxx 输入 ./xxx ,11.2 shell变量,11.2.1 shell变量描述 shell实际上是基于字符串的程序设计语言,但也有变量。shell变量能够而且只能存储正文字符串,即它只有一种类型的变量即串变量。 变量的名字必须以字母或下划线开头,可以包括字母、数字和下划线。,11.2.2 用户自定义变量 用户自定义变量语法格式:name=string,赋值号“=”两边不允许有空白符。 例: nodehost=beijing.UUCP pa
6、th=/bin:/usr/bin:/etc/bin count=10 允许多个赋值操作,按从右到左的顺序进行。,例: # B=abc A=B C=OK # echo A B C abc abc OK 当引用一个未设置的变量时,其隐含值为空。 例: # echo mail is path of mailbox is path of mailbox,11.2.3 shell中的特殊字符 1.双引号 (“”) 如果用双引号“”将值括起来,则括起来的字符串允许出现空格、制表符和换行符等特殊字符,而且允许有变量替换。,例1: # MAIL=/var/mail/fk # var=MAIL is path
7、of mailbox # echo var /var/mail/fk is path of mailbox 例2: # str=This is n a book # echo str This is a book,使用双引号能消除被括在双引号中的大部分特殊字符的含义,不能消除的字符有:、 、!、 。 例1: #echo Type a *, please Type a *, please 例2: #echo “today is date” 例3: #echo “ !3 ”,2. 单引号() 使用单引号消除被括在单引号中的所有特殊字符的含义,即单引号表示内容照原样不动。 例3: # BOOK=En
8、glish book # MSG=BOOK # echo MSG - echo $MSG # $BOOK $MSG 例4: # msg= Today is date # echo msg Today is date,3.反撇号() 当一个字符串被括在反撇号“ ”中时,该字符串将作为命令被shell解释执行,即用命令的执行结果替换这个字符串本身。要注意反撇号与单引号的区别。 例1: # lm=pwd # echo lm /root,例2: # now=date # echo now date # now=date # echo now 1998年 10月 28日 星期三 17时 51分 56秒
9、CST 例3: #etho “Hostname:hostname”,$()的功能与一样 例1: #now=$(date) #echo $now 例2: #echo $(pwd) 例3: #etho “Hostname:$(hostname)”,4.转义符() 使用转义符消除单个字符的特殊含义,即将紧跟在转义符后面的单个字符按字符本身的实际含义解释。 例1: #echo your cost is $5.00 #echo “your cost is $5.00” #echo your cost is $5.00,例2:转义符具有续行功能 #ls -l #ls -l 例3: echo * 00000
10、 * echo * 00000 * echo “* 00000 *” echo * 00000 *,5.大括号 引用变量的值时,可以用花括号将变量名称括起来,使变量名称与它的后续字符分隔开,如果紧跟在变量名称后面的字符是字母、数字或下划线时,必须要使用花括号。 例1: #num=2#echo this is the $numnd #echo this is the $numnd,例2: #str=This is a string #echo strent test of variables This is a stringent test of variables #echo strent t
11、est of variables test of variables,11.2.4 常用命令 1.echo命令 显示变量内容 # echo $variable 2.env命令 显示目前系统中主要的预设变量内容 #env,3.set命令 显示目前系统中全部的变量内容 #set 4.unset命令 直接将该变量的内容拿掉: #unset 变量名,5.export命令 #test=game #echo $test #bash 进入子shell #echo $test 显示结果将为空 #exit 退出子shell #export test #bash #echo $test game,6.alias命
12、令 命令别名是一个很有趣的东西,特别是你的惯用指令特别长的时候!还有,增设预设的属性在一些惯用的指令上面,可以预防一些不小心误杀档案的情况发生的时候! #alias #alias lm=ls -al | less #alias h = history 如果要取消命令别名的话,就使用 unalias !,7.read命令 上面讲的变量都是直接设定好的!那么可不可以让变量内容是由使用者由键盘输入呢!可以使用 read 来达成!这个命令在脚本里面比较重要的! # read name testing =这个时候屏幕会等待使用者由键盘输入! # echo $name testing =刚刚输入的数据变成
13、了变量的内容!,在 bash 底下的变量设定是有一定规则的,必须遵守才行: 变量与变量内容以等号=来连结; 等号两边不能直接接空格符; 变量名称只能是英文字母与数字,但是数字不能是开头字符; 若有空格符可以使用双引号 或单引号 来将变量内容结合起来,但须要特别留意,双引号内的特殊字符可以保有变量特性,但是单引号内的特殊字符则仅为一般字符;,必要时需要以跳脱字符 来将特殊符号(如Enter, $, , 空格符, 等)变成一般符号; 在一串指令中,还需要藉由其它的指令提供的信息,可以使用 quote command ; 若该变量为扩增变量内容时,则需以双引号及 $变量名称如: $PATH:/hom
14、e继续累加内容;,若该变量需要在其它子程序执行,则需要以 export 来使变量可以动作,如export PATH; 通常大写字符为系统预设变量,自行设定变量可以使用小写字符,方便判断(纯粹依照使用者兴趣与嗜好); 取消变量的方法为:unset 变量名称。,数学运算-$ #a=3 #b=5 #c=7 #echo $a+$b #echo $a*$b echo $a/$b echo $a%$b echo $a*$b,数学运算expr #a=3 #b=5 #expr $a + $b #expr $a - $b #expr $a / $b #expr $a * $b,11.2.5 位置变量 位置变量顾
15、名思义是与变量所在位置有关的变量,这是一种特殊的变量。当一个shell过程被调用时,shell隐含地为它建立一系列的位置变量。这种位置变量是系统预定义好的,可以直接引用。如命令行的shell过程名本身被指定为位置变量0,第一个命令参数为1,第九个命令参数为9。 例: ls / /bin /etc /usr/bin /dev 0 1 2 3 4 5,# vi test11-1.sh #!/bin/bash # This program will define what is the parameters echo This scripts name = $0 echo parameters $1
16、 $2 $3 # sh test11-1.sh pa1 pa2 pa3 This scripts name = test11-1.sh parameters pa1 pa2 pa3,11.2.6 环境变量 shell执行环境由一系列环境变量组成,这些变量是由shell维护和管理的。所有这些变量都可被用户重新设置,变量名由大写字母或数字组成。,HOME 用户的home目录; PATH 寻找命令或可执行文件的搜索路径; PS1 主命令提示符,默认为“”; PS2 从命令提示符,默认为“”; SHELL 使用的shell类型; TERM 使用的终端类型;,HOME=/root PATH=/usr/l
17、ocal/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin PS1=uh W$ PS2= SHELL=/bin/bash TERM=xterm,PS1中可用信息 $用$作为提示符 显示 d显示当前日期 h显示主机名 s显示shell名 t显示当前时间(24) T显示当前时间(12) 显示当前时间(AM/PM) u显示用户名 v显示bash的版本 W显示当前工作目录 w显示当前工作路径,11.2.7 预定义的特殊变量 在shell中有一组特殊的变量,其变量名和变量值只有shell本身才可以设置。
18、“#” 记录传递给shell的自变量个数。 例1: myprog a b c 则#的值为3 例2:(test11-2.sh) if test # -lt 2 then echo two or more args required exit fi,“?”取最近一次命令执行后的退出状态:执行成功返回码为0,执行失败返回码为1。 例: $cd /home $echo $? 0 cd /abcd echo? 1,“”-记录当前shell的进程号。 “$*”和“$”都表示传递给函数的所有参数,两者的区别是“$*”把所有的参数作为一个整体,而“$”把所有参数看作拥有多个参数的集合,可以单独访问每一个变量。
19、,# vi test11-3.sh echo para $* is:$* echo para $ is:$ count=1 for para in $ do echo para $count is: $para let count=$count+1 done,#test11-3.sh pa1 pa2 pa3 para $* is:pa1 pa2 pa3 para $ is:pa1 pa2 pa3 para $1 is: pa1 para $2 is: pa2 para $3 is: pa3,11.3 shell控制结构,11.3.1 条件与test命令 在程序设计语言中,作出决策的结构称为条件
20、。在高级语言中决策的作出是依赖于基本运算的结果;在shell语言中,作出决策所依赖的条件是所执行命令的“出口状态”。,当shell命令或程序执行成功时,它返回一个“零”出口状态(即?为零);如果执行的命令或程序出错时,则返回一个“非零”的出口状态(即?不为零)。 除了一般命令的出口状态外,UNIX还提供了两个命令true和false的出口状态。true的出口状态为零;而false的出口状态为非零。shell将true和false命令作为恒真和恒假条件使用。,1. test命令 test命令是shell程序设计的条件判断中最常用的测试命令,它有两种等价的格式: test expression或
21、expression (注意: 中的空格) 其中expression就是要测试的条件。如果test计算expression的结果为真,则返回“零”出口状态,否则返回“非零”出口状态。test命令可用于对字符串、整数及文件进行各类测试。,2. test字符串测试表达式 例1: 两个字符串进行比较 user=smith test user= smith echo ? 0 test user = tom echo ? 1,例2: 带有空格的字符串比较 month= January test month = January echo ? 1 test month = January echo ? 0
22、注意: shell在处理变量时,遇到有双引号将保留其内容,而省略双引号时,将滤去空格。,例3: 带有空格的字符串比较 a=testing string test a = testing string echo ? 0 test a = testing string bash: test: too many arguments shell处理变量 a 时,将其进行变量替换,然后将结果(testing string)传递给test,而test将string作为操作符来处理,因此出错。,例4: 带有空串(或未设置的字符串比较) name= test name = smith echo ? 1 tes
23、t name = smith bash: test: =: unary operator expected $ test $name = $ echo $? 0 shell处理变量name时,双引号将其括起的内容作为一个“位置持有者”来保留,并把该值传递给test,保证处理的正常执行。,例5: 带有空串的字符串比较 blanks= test blanks echo ? 1 test blanks echo ? 0 shell处理变量blanks时,将空格滤去,使其变为空串传递给test;而双引号保留 “位置持有者”的位置,其值为一个空格(空白符),传递给test。,例6:比较字符串的长度 sy
24、m=hello test -z sym $ echo $? 1 $ test -n $sym $ echo $? 0,3. 使用test测试字符串时要注意的问题 (1) 向test 传递的各自变量之间必须有空白字符,如果“=”与任一自变量之间没有空白字符就会产生错误。 (2) 在使用变量的值替换的自变量上,用双引号括起来十分必要,以保证test在变量的值为空时也能接收到该自变量,这是一种良好的shell程序设计风格。,(3) 在test命令的测试中,空格和引号是shell程序设计中经常发生错误的焦点,要特别引起注意。 (4) test命令对它的自变量非常讲究,在比较的串中出现运算符时,要考虑到
25、运算符优先级的问题。,4. test命令可用于整数比较 首先要搞清楚整数比较的两个概念: shell并不区分放在shell变量中的值的类型,就变量本身而言,它存放的仅仅是一组字符串,即shell只有一种类型的变量串变量;当使用整数比较操作符时,是test命令来解释存放在变量中的整数值,而不是shell。 命令格式为, test 整数测试表达式,例1: x1= 005 x2= 10 test x1 = 5 echo ? 1 例2: test x1 -eq 5 echo ? 0 例3: test x2 -eq 10 echo ? 0,5. test用于文件的测试 test可用于文件各种特性的检查。
26、这些文件的操作符自然是一原操作符,意味着它们要求其后跟随一个自变量。在所有的情况中,这个自变量是一个文件或目录名。常用的文件测试表达式示例如下: 例1: 检查指定的文件是否存在并且可读 test -f /usr/fk/message,例2: 检查指定的文件是否为目录 test -d /usr/src/local/sendmail 例3: 检查指定的出错文件是否为空,如不空则列出该文件的内容 test -s errfile then echo script is running. else echo STOP! fi,# sh test11-4.sh Press y to continue y
27、script is running. # sh test-4.sh Press y to continue n STOP!,但是这里有个问题,就是如果我输入为 Y 时,程序还是停止了!怎么办?这个时候就需要使用到 | 这个东西啦!我们可以这样做! vi test11-5.sh #!/bin/bash # This program is used to study if then echo Press y to continue read yn if $yn = y | $yn = Y ; then echo script is running. else echo STOP! fi,# sh
28、test11-5.sh Press y to continue y script is running. # sh test11-5.sh Press y to continue Y script is running.,如果再加上前面提过的: parameter 的选用呢? Vi test11-6.sh #!/bin/bash # set parameters in the if then # 需要加上 hello 这个参数才会显示正确的! if $1 = hello ; then echo Hello! How are you ? elif $1 = ; then echo You mus
29、t input parameters else echo The only accept parameter is hello fi,# sh test11-6.sh hello Hello! How are you ? # sh test11-6.sh You must input parameters # sh test11-6.sh djdkf The only accept parameter is hello,例:逻辑判断式的使用方式 1.先查看一下当前目录下logical 这个名称是否存在; 2.若不存在,则建立一个文件,使用 touch 来建立,建立完成后离开; 3.如果存在的话
30、,判断该名称是否为文件,若为文件则将之删除后建立一个目录,名为 logical ,之后离开; 4.如果存在的话,而且该名称为目录,则移除此目录!,Vi test11-7.sh #!/bin/bash # using if and then to select file or directory if ! -e logical ; then touch logical echo Just make a file logical exit 1 elif -e logical then rm -rf logical echo remove directory = logical exit 1 els
31、e echo Does here have anything? fi,2. case结构,格式:,说明: “条件”可以是变量、表达式、shell命令等; “模式”为条件的值,并且一个“模式”可以匹配多种值,不同值之间用竖线(|)联结 ; 一个模式要用双分号(;)作为结束 ; 以逆序的case命令(esac)表示case分支语句的结束,case 条件 in 模式1) 命令1 ; 模式2) 命令2 ; . 模式n) 命令n ; esac,Vi test11-8.sh #!/bin/sh case $1 in start | begin) echo start something ; stop |
32、end) echo stop something ; *) echo Ignorant ; esac,例:判断系统在哪一种平台上! Vi test11-9.sh #!/bin/bash SYSTEM=uname-s case$SYSTEMin Linux) echoMysystemisLinux echoDoLinuxstuffhere. ; FreeBSD) echoMysystemisFreeBSD echoDoFreeBSDstuffhere. ; *) echoUnknownsystem:$SYSTEM echoIdontwhattodo. ; esac,3. for结构,格式,说明:
33、 “列表”为存储了一系列值的列表,随着循环的进行,变量从列表中的第一个值依次取到最后一个值; do和done之间的命令通常为根据变量进行处理的一系列命令,这些命令每次循环都执行一次; 如果中括号中的部分省略掉,Bash则认为是“in $”,即执行该程序时通过命令行传给程序的所有参数的列表。,for 变量 in 列表 do 命令(通常用到循环变量) done,Vi test11-10.sh #!/bin/bashWORD=a b c d e f g h i j l m n o p q r s t u v w x y zfor i in $WORD ; do echo $i done,Vi tes
34、t11-11.sh #!/bin/bash FILES=ls /root/*.txtfor txt in $FILES ; do doc=echo $txt | sed s/.txt/.doc/ mv $txt $doc done,4. while与until结构,格式:,说明: while循环中,只要条件为真,就执行do和done之间的循环命令; until循环中,只要条件不为真,就执行do和done之间的循环命令,或者说,在until循环中,一直执行do和done之间的循环命令,直到条件为真; 避免生成死循环。,while/until 条件 do 命令 done,Vi test11-12.
35、sh #!/bin/bash x=1 while $x -lt 5 do mm=expr $x * $x echo $mm x=$x+1 done echo the while is end!,结果是: 1 4 9 16 the while is end!,Vi test11-13.sh #!/bin/bash x=1 until $x -ge 5 do mm=expr $x * $x echo $mm x=$x+1 done echo the until is end!,结果是: 1 4 9 16 the while is end!,循环体中的其它命令,1. break命令 格式为: bre
36、ak或break n break是shell的内部命令,用于在循环体中根据命令运行的返回条件,直接终止循环体内命令的执行。当执行break命令时,控制流从循环体中转移到done之后的第一条命令上。当执行break n命令时,则终止最内层的n个循环的执行。,2. continue 命令 格式为, continue或continue n continue是shell的内部命令,用于在循环体中根据命令运行的返回条件,直接进入下一次循环命令的执行。当执行continue命令时,控制流直接转到本循环体中第一条命令上。当执行continue n命令时,则跳过最里层的 n次循环体的执行,即开始第n个(从内向
37、外数) 循环的下一个循环过程。,#测试continue (test11-14.sh) #!/bin/bashI=1 I=$I + 1while $I -lt 10 do if $I -eq 3 then continue fi if $I -eq 7 then break fi echo $I done 执行上面程序,结果如下: 2456,Vi test11-15.sh Sum=0 i=0 while true do i=expr $i + 1 Sum=expr $Sum + $i if $i = 100 then break fi done echo $i $Sum 这个程序的运算就是将1到100加起来,最后这个程序显示的是 100 5050,Vi test11-16.sh #!/bin/bash Sum=0 i=0 while $i != 100 do i=expr $i + 1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 仓库货物分类储存手册
- 水池蓄水施工方案(3篇)
- 河堤单模施工方案(3篇)
- 活动策划方案背景模版(3篇)
- 深圳团建施工方案(3篇)
- 灌区渗漏施工方案(3篇)
- 石开挖施工方案(3篇)
- 网架平板施工方案(3篇)
- 节庆盛典策划活动方案(3篇)
- 试验路基施工方案(3篇)
- 华为固定资产管理制度
- 客运驾驶员培训教学大纲
- 洗浴员工协议书
- 园区托管运营协议书
- 清欠历史旧账协议书
- 临床创新驱动下高效型护理查房模式-Rounds护士查房模式及总结展望
- 乙肝疫苗接种培训
- GB/T 45133-2025气体分析混合气体组成的测定基于单点和两点校准的比较法
- 食品代加工业务合同样本(版)
- 北京市行业用水定额汇编(2024年版)
- 安全生产应急平台体系及专业应急救援队伍建设项目可行性研究报告
评论
0/150
提交评论