版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第3章Shell及其编程计算机学院潘薇panwei117@本章要点3.1Shell概述3.2Shell脚本3.3Shell脚本变量3.4Shell控制结构3.5Shell函数3.1Shell概述3.1Shell概述Shell是用户和Linux(或者更准确的说,是用户和Linux内核)之间的接口程序。你在提示符下输入的每个命令都由Shell先解释然后传给Linux内核。Shell是一个命令语言解释器,拥有自己内建的Shell命令集。此外,Shell也能被系统中其他有效的Linux实用程序和应用程序所调用。3.1Shell概述Shell具有的主要功能有:命令解释功能:将用户可读的命令转换成计算机可理解的命令,并控制命令执行。输入/输出重定向:操作系统将键盘作为标准输入、显示器作为标准输出。当这些定向不能满足用户需求时,用户可以在命令中用符号“>”或“<”重新定向。管道处理:利用管道将一个命令的输出送入另一个命令,实现多个命令组合完成复杂命令的功能。系统环境设置:用Shell命令设置环境变量,维护用户的工作环境。程序设计语言:Shell命令本身可以作为程序设计语言,将多个Shell命令组合起来,编写能实现系统或用户所需功能的程序。3.1.2CShellCShell由BillJoy在Berkeley开发,因CShell在程序语言结构上和C相似,故称为CShell(或C-Shell),系统提示符为“%”。如果在用户管理文件/etc/passwd中将用户的Shell设置成csh,用户的默认Shell就是C-Shell。在其他Shell环境下通过输入命令csh可以切换到C-Shell。与其他Shell比较,C-Shell更适合交互式环境。C-Shell最突出的特征是有历史(history)命令。历史命令用于存储最近使用的命令。用户可以定义存储历史命令的数量、显示历史命令、编辑并重新使用编辑后的命令。3.1.2CShell例设置CShell的history。%sethistory=5%cd%pwd/home/zhouxx%cdzhouxx%history21sethistory=522cd23pwd24cdzhouxx%3.1.2CShell输入!!则重复前一条命令:%!!history21sethistory=522cd23pwd24cdzhouxx%输入!$则重复指定的命令。%!23pwd/home/zhouxx%3.1.2CShell另外,CShell还有一个特别的用途,就是可以将新的Shell命令归到默认Shell路径下。方法是只需在使用新命令之前先用命令:rehash。例现有新编Shell命令netsend。%netsendnetsend:Commansnotfound%rehash%netsend%3.1.3KornShellKornShell(简称K-Shell)由贝尔实验室的DavidKorn开发。KornShell和BourneShell有许多兼容的地方,如系统提示符也是$,环境变量的设置格式完全相同。不同的是KornShell有些内置功能可以从Shell直接定义。与CShell相比,KornShell除了有历史命令之外,还有更好的命令编辑形式。与C-Shell一样,K-Shell也有历史文件。3种shell的比较BourneShell是大多数UNIX操作系统默认的Shell,系统提示符为“$”,简称为B-Shell。CShell在程序语言结构上和C相似,故称为CShell(或C-Shell),系统提示符为“%”,拥有命令历史、别名和作业控制等功能。KornShell(简称K-Shell)和BourneShell有许多兼容的地方,如系统提示符也是%,不同的只是KornShell有些内置功能可以从Shell直接定义。与CShell相比,KornShell除了有历史命令之外,还有更好的命令编辑形式。Linux下可以使用的shellLinux默认的shell——BashBash的主要优点:命令记忆功能history:用上下键就可以找到上一个和下一个输入的命令,默认可以记录1000个历史命令。命令与文件名补全tab键:按一次可以补全命令或者文件名,按两次可查看满足条件的命令或者文件有几个。命令别名设置alias:为常使用但又较长的命令设置较短的别名。可使用alias查看当前设置的别名。通配符——*、?、[]、[-]、[^]Bash的变量功能shell的变量,简答来说就是用一个特定的字符串来代表具有特定含义但是取值可变的内容。影响shell环境操作的变量我们称之为环境变量。一般采用大写来表示环境变量。如:PATH、HOME等等。也可以由用户自定义变量来保存一些信息,一般采用小写,变量不能以数字作为首字母。想要显示单个变量可以使用echo命令,例:
echo$PATH echo${myname}其中,$表示取后面变量的值。Bash的变量功能变量取值的修改使用=,例:
myname=lili如果想给变量增加内容,可以以如下方式实现:
PATH=${PATH}:/home/abc若希望自定义的变量可以在新开的shell内执行,那么可以使用export把变量设置成环境变量。
exportmyname取消变量的命令是unset,例:
unsetmynameBash的变量功能查看当前shell的所有环境变量可以使用env命令。查看当前shell的所有环境变量和自定义变量使用set命令。3.2Shell脚本3.2Shell脚本Shell具有程序设计功能,如果在使用系统时需要用重复、复杂的命令完成某项工作,就可以利用Shell编程实现。同一般的结构化程序不同,Shell程序是按行解释,不需要编译成目标程序,也不需要连接成可执行的目标码,只要Shell脚本是可执行程序就可以直接运行。由Shell命令构成并由Shell执行的命令文件称为Shell脚本(ShellScript)。从广义上看,任何从键盘上键入的Shell命令都是Shell脚本。3.2Shell脚本一般Shell脚本由编辑器vi创建。为了使脚本便于理解,以#为注释符,#之后直到行末的字符串为注释。#!是说明hello这个文件的类型的,Linux系统根据"#!"及该字串后面的信息确定该文件的类型脚本中忽略Tab键和空格,内容过长超过一行时用反斜线\表示换行继续。脚本文件属性必须是可执行的才可以运行,否则要通过命令chmod将脚本文件属性设置为可执行。3.2Shell脚本例shell脚本jobbegin及其运行。
$catjobbegin#!/bin/bash#Myjobbegineverydaydatecd/liuxim/projectecho‘myworkingdirectoryis:’pwd#scriptend$
将该脚本文件属性设置为可执行后,就可以运行了。3.2Shell脚本执行Shell脚本有三种方式:方式1:直接键入Shell脚本文件名,这种运行方式表示启动新的Shell执行该脚本。方式2:shShell脚本文件名,这种运行方式表示启动新的Shell执行该脚本。方式3:.Shell脚本文件名,这种运行方式表示在原Shell下执行该脚本。注意有时运行脚本文件时系统不能辨识当前路径,用户只有输入文件的全路径名或用./文件名的方式告诉Shell到当前目录下寻找文件名。3.2Shell脚本用命令pwd确定当前的工作目录:$pwd/home/liuxim$直接输入脚本名运行脚本文件:$jobbeginFriMar2817:09:31TAIST2003myworkingdirectoryis:/home/liuxim/project$3.2Shell脚本运行完后再用pwd确认当前工作目录:$pwd/home/liuxim$从脚本执行可见,脚本运行前的当前目录为/home/liuxim,脚本运行完后的当前目录仍然是/home/liuxim。而脚本中的内容却要求进入目录/home/liuxim/project,原因是脚本执行启动了一个新Shell进程,脚本执行完则立即结束该新Shell进程,又回到原来的主Shell,所以最后的pwd命令得到的仍然是原工作目录。3.2Shell脚本用方式2运行:键入sh脚本文件名。$shjobbeginFriMar2817:09:31TAIST2003myworkingdirectoryis:/home/liuxim/project$$pwd/home/liuxim$结果和方式1相同。3.2Shell脚本用方式3运行:键入.脚本文件名。$.jobbeginFriMar2817:09:31TAIST2003myworkingdirectoryis:/home/liuxim/project$$pwd/home/liuxim/project$脚本执行结果与最后用pwd命令结果所显示的目录均是/home/liuxim/project。之所以这样是因为脚本执行没有启动新Shell进程,整个都在原来的Shell下,shell进程只有一个,随脚本进入了目录/home/liuxim/project。3.3Shell脚本变量3.3Shell脚本变量同其他程序设计语言一样,在Shell脚本中也可以使用变量。通常将Shell变量分为环境变量和临时变量。临时变量的值随着Shell程序的结束会自然消失。临时变量又可分为系统特殊变量和用户自定义变量。3.3.1环境变量变量值保持不变,不随Shell程序的结束而消失的变量称为环境变量。环境变量决定了用户的工作环境。环境变量在系统配置文件中设置,用大写字母表示。常用的环境变量有PATH、TERM、HOME、PS1、PS2、LOGNAME。3.3.1环境变量PATH变量:用来设定指令搜索路径。当用户键入命令时,Shell会在PATH变量所设定的路径下从左至右寻找。PATH内含有一串Shell所要查找的路径名称,用冒号隔开。例$echo$PATH/usr/bin:/bin:/usr/ucb:/etc:$3.3.1环境变量TERM变量:用来设置用户使用的终端类型(系统主控台console不用设定)。如果用户通过网络登录到LINIX系统,则应将TERM值设置成与系统相应终端类型一致。例在Windows中用telnet登录到LINIX时需将终端配置成vt100。#TERM=vt100#exportTERM#echo$TERMvt100#3.3.1环境变量HOME变量:用来设定用户的默认目录(即用户根目录或家目录)。用户登录系统时默认进入该目录。例
$echo$HOME/home/liuxim$3.3.1环境变量PS1变量:设置系统提示符,默认为#(超级用户)、$(B-shell和K-Shell)、%(C-Shell)。例$echo$PS1$$PS1=/home/liuxim;exportPS1/home/liuxim3.3.1环境变量PS1中可以设置一些特殊符号来定制内容。\d:显示“星期几月日”,如“MonFeb2”\h:主机名\t:显示时间“HH:MM:SS”\u:目前用户的帐号\W:当前目录\w:当前目录的绝对路径\$:提示符,root为#,其他用户为$\#:执行的第几个命令3.3.1环境变量PS2变量:设置系统的次提示符,默认为“>”。部分Linux系统不支持该变量。例$bc>112+34>146>(345-11)*2>668>Ctrl-d$3.3.1环境变量用命令env可以显示目前所有的环境变量。$env_=/usr/bin/envLANG=en_USLOGIN=liuximPATH=/usr/bin:/etc:/usr/sbin:/usr/ucb:/usr/bin/X11:/sbin……USER=liuximSHELL=/usr/bin/kshHOME=/home/liuximTERM=vt100PWD=/home/liuxim$3.3.2特殊变量Shell定义了如下几个特殊变量用于执行Shell命令时存放命令及命令参数:$0,$1,$2,$3,$4,$5,$6,$7,$8,$9其中:$0存放命令名,$1、$2、$3、$4、$5、$6、$7、$8、$9从左至右分别存放命令参数。命令shift用于移动位置参数,将$2中的内容移至$1,$3中的内容移至$2,$4中的内容移至$3,依次类推,但位置参数$0不参加移位。shift命令格式为:shift[n]n表示向左移动参数的个数,默认值为1。3.3.2特殊变量例:应用位置参数及shift命令。$catmovelab1##thisprogramshowshiftecho$0echo$1,$2,$3,$4,$5,$6,$7,$8,$9;shiftecho$1,$2,$3,$4,$5,$6,$7,$8,$9;shiftecho$1,$2,$3,$4,$5,$6,$7,$8,$9;shiftecho$1,$2,$3,$4,$5,$6,$7,$8,$9;shiftecho$1,$2,$3,$4,$5,$6,$7,$8,$9;shiftecho$1,$2,$3,$4,$5,$6,$7,$8,$9;shiftecho$1,$2,$3,$4,$5,$6,$7,$8,$9;shiftecho$1,$2,$3,$4,$5,$6,$7,$8,$9;shiftecho$1,$2,$3,$4,$5,$6,$7,$8,$93.3.2特殊变量$movelab1112233445566778899movelab111,22,33,44,55,66,77,88,9922,33,44,55,66,77,88,99,33,44,55,66,77,88,99,,44,55,66,77,88,99,,,55,66,77,88,99,,,,66,77,88,99,,,,,77,88,99,,,,,,88,99,,,,,,,99,,,,,,,,$3.3.2特殊变量下面是一些与位置参数有关的特殊变量:$#:能提供给脚本的位置参数个数。$$:当前Shell脚本的进程号。$!:上一个后台命令的进程号。$?:执行最后一条命令的退出状态。$*:位置参数字符串,所有位置参数字符串组成一个大的字符串。$@:位置参数字符串,每个位置参数字符串都是一个单独的字符串。3.3.2特殊变量例$catexerecho$1,$2,$3,$4,$5,$6,$7,$8,$9echo‘$#=’$#echo‘$$=’$$echo‘$!=’$!echo‘$?=’$?echo‘$*=’$*echo‘$@=’$@3.3.2特殊变量$exer123456789abc1,2,3,4,5,6,7,8,9$#=11$$=24056$!=14361$?=0$*=123456789abc$@=123456789abc$3.3.3用户自定义变量用户自定义变量是用户根据自己的需要在Shell中定义的临时变量。用户定义变量除数字之外还可以是字母、下划线和其他文字,长度不限。用户定义变量要区分大小写。用户自定义变量格式为:
variable-name=value在定义等式中等号两端不允许有空格,执行时将右端的计算结果指定给左端。如果用户变量值中有空格,必须用引号将变量值括起来。用户变量的使用与环境变量一样,要在变量名前加符号“$”,表示要使用该变量的值。用户定义变量非常灵活,需要改变时可以随时重新定义。3.3.3用户自定义变量清除变量:如果所设置的变量不需要时可以清除。格式为:unsetvariable-name例先定义exer的值为/home/liuxim/exer,然后清除exer。$exer=/home/liuxim/exer$echo$exer/home/liuxim/exer$unsetexer$echo$exer$3.3.3用户自定义变量可以将字符与变量、变量与变量组合在一起使用。组合格式分别为char$variable,$var1$var2。例:$d=day$echo“Sun$d,Mon$d,Tues$d,Wednes$d,Thurs$d,Fri$d,Satur$d”Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday$h=/home$me=/liuxim/exer$echo$h$me/home/liuxim/exer$3.3.3用户自定义变量使用变量时如果不能确定该变量是否已经定义,可以用变量测试语句:
{variable-name:-new-value}表示如果没有定义则用新值(new-value)定义;如果已经定义则维持原定义。3.3.3用户自定义变量例首先设置state的值为order,然后再引用。$state=order$echo“Everythingwasinastateof${state:-disorder}”Everythingwasinastateoforder$unsetstate$echo“Everythingwasinastateof${state:-disorder}”Everythingwasinastateofdisorder$3.3.3用户自定义变量命令替换是将一个Shell命令的输出作为另一个命令的参数,还可以赋予变量。为了区别一般字符串,用倒单引号括起命令。例$echo“Nowmyworkdirectoryisˋpwdˊ”Nowmyworkdirectoryis/home/liuxim$time=ˋdateˊ$echo$timeSunMar3009:39:28TAIST20033.3.3用户自定义变量双引号内的内容如果包含$和单引号则保留Shell中的定义,包含倒单引号则作命令替换单引号内的内容完全为普通字符串,不作命令替换倒单引号内的内容只能是命令例:$echoˋpwdˊ/home/liuxim/project$echo‘ˋpwdˊ’ˋpwdˊ$echo“ˋpwdˊ”/home/liuxim/project3.3.3用户自定义变量$var=123$echo$var123$echo“$var”123$echo‘$var’$var$var=ˋdateˊ;echo$varSunMar3009:34:00TAIST2003$var=$(date);echo$vardate3.3.4显示变量用命令set可以显示所有变量,包括环境变量和临时变量。例$setFCEDIT=/usr/bin/edHOME=/home/liuximPS1='$'PS2='>'PS3='#?'PS4='+'PWD=/home/liuximvar1=11var2=22……3.3.5shell输入/输出命令在Shell中用read命令从标准输入读入数据并将读入的数据赋值给变量。命令格式:readvariable-name1[variable-name2,…]命令的标准输出是早已熟悉的echo命令。例$readvar1var2var3var4112223333444455555$echo$var1$var2$var3112223333$echo$var44444555553.3.5shell输入/输出命令$readvar1var2var3var4112233$echo$var1$var2$var3112233$echo$var4$可见,输入的值太多会将多余的值全部赋予最后一个变量;输入的值太少,后面的变量被赋予空值。echo是换行标准输出语句。echo输出多个空格时必须用引号括起,否则再多的空格也被认为只有一个。3.3.5shell输入/输出命令echo可以使用通配符:“*”表示任意字符。“?”表示一个字符。“A%”表示A之后任意多个字符。“%A”表示A之前任意多个字符。“A-Z”表示A到Z之间的任意字符。“\c”表示不换行,连续输出。“\\”表示要显示反斜线“\”。“\n”表示换行输出。3.3.5shell输入/输出命令例$echoDoyouseethatnotice?Itsays‘……’Doyouseethatnotice?Itsays……$echoDoyouseethatnotice?Itsays……Doyouseethatnotice?Itsays……$echo*db2db2red.pdfhlliujobbeginlliumboxprojectv7-dbacert.pdfxy1$echodb*db2db2red.pdf$echo[a-z]*db2db2red.pdfhlliujobbeginlliumboxprojectv7-dbacert.pdfxy13.3.6shell中的运算Shell提供基本的算术运算有+(加)、-(减)、﹨*(乘)、/(除)、%(余数)。使用这些运算符时要用expr语句处理,只提供整数运算。需要注意的是在运算符的前后需留有空格。例:$expr24/64$var=$(expr124\*2)$echo$var248$3.3.6shell中的运算也可以使用$((计算式))来进行数值运算,也只支持整数运算。例:
var=$((13/4)) echo$var echo$((13/4))3.4Shell控制结构3.4Shell控制结构在Shell中可以使用语句控制程序流程。ifthenelsecaseforwhileuntilbreakcontinueShell的测试判断功能Shell的测试判断功能使用[]来进行判断时需要注意:1.括号中每个符号之间都需要空格来分隔;2.括号中的变量最好都用双引号括起来。注意:以下例子中的红色加号“+”代表空格。#[+–e+file1+]#echo$?1#[–efile2]#echo$?0#[+“$HOME”+=+“/root”+]#echo$?0Shell的测试判断功能Shell的测试判断功能Shell的测试判断功能字符类测试条件string1=string2当两个字符串相等时为truestring1!=string2当两个字符串不相等时为true-zstring当字符串长度为0时为true-nstring当字符串长度非0时为true其他测试条件!expression当表达式expression为假时为trueexpression1-aexpression2当表达式expression1和expression1都为真时为trueexpression1-oexpression2当表达式expression1或expression1为真时为true3.4.1ifthenelse语句3.4.1ifthenelse语句3.4.1ifthenelse语句3.4.1ifthenelse语句3.4.1ifthenelse语句3.4.1ifthenelse语句3.4.1ifthenelse语句3.4.1ifthenelse语句3.4.1ifthenelse语句3.4.2case语句case是一个多选择语句,根据变量与哪种模式匹配而执行相应的语句序列,采用相应的动作。case语句的基本格式为:casevalueinvalue1) command11 command12 …… command1n;; ……valuen) commandn1 commandn2 …… commandnn;;esac3.4.2case语句3.4.2case语句3.4.3for语句for为循环语句。基本格式为: forvariableinlist do commands done其中variable是变量。如果变量值在列表中就执行一次循环,完成do到done之间的所有命令。3.4.3for语句3.4.3for语句3.4.3for语句3.4.3for语句3.4.3for语句3.4.3for语句3.4.3for语句3.4.3for语句for语句的另一种形式:for((初始值;限制值;执行步长))do ……done这种for循环类似于C语言,适用于确定循环次数的数值运算的循环体。
3.4.3for语句3.4.3for语句嵌套语句格式:forvariable1inlist1doforvariable2inlist2docommandsdonedone3.4.4while语句3.4.4while语句3.4.4while语句3.4.4while语句3.4.4while语句3.4.5until语句3.4.5until语句3.4.5until语句3.4.6break和continue语句使用break和continue语句控制循环。break命令在作一些处理后跳出循环或跳出case语句。如果是位于一个多层嵌套循环中,还可以指定跳出的循环层数。命令格式:breaknn为要跳出的循环层数,默认值为1。continue命令也是在循环中跳转,但与break不同的是,它不是跳出循环,而是跳出循环步,回到循环头部继续执行循环。命令格式:continuenn为要跳出的循环层数,默认值为1。3.4.6break和continue语句3.4.6break和continue语句3.4.6break和continue语句3.4.6break和continue语句3.5Shell函数3.5Shell函数除了在Shell中可以定义变量之外,在Shell中也可以定义函数。Shell函数是将Shell的一些语句或命令集组合在一起形成能完成特定功能的程序块。当Shell脚本需要时可以直接调用。Shell函数的基本格式为:funcname(){commands}通常将函数看成是脚本中的一段代码,在使用函数之前必须先定义该函数,使用时利用函数名直接调用。3.5Shell函数3.5Shell函数例下面首先创建函数,然后调用函数。首先用cat命令查看funcexer函数定义的脚本内容:$catfuncexerabc(){echo“Thisisthefunctionabc,param=$1”}echo“Theabcfunctonbegin”abc234echo“Theabcfunctonend”##funcexerend$3.5Shell函数$./funcexerTheabcfunctonbeginThisisthefunctionabc,param=234Theabcfunctonend$执行函数时保留当前Shell和内存信息,Shell脚本和函数之间的参数传递利用变量直接传递。函数有两种方式可以返回到脚本中调用函数的控制部分:1.当函数正常执行到末尾时直接返回。2.用return语句返回时带值0或1,0表示函数调用无错,1表示有错。3.6Shell工具3.6Shell工具Linux操作系统提供了一些命令用于Shell脚本的调试,将这些命令称为Shell工具。常用的有:trap、logger、eval等。3.6.1通知trap通知trap是操作系统监控命令,用于在Shell脚本中捕捉信号。trap命令格式:trapoperateingsignals其中signals表示捕捉到的信号;operating是专门用来处理捕捉到信号后所采取操作的函数,使用时用双引号(“”)将operateing括起来。在Linux系统中可以发出的signals信号及其描述如表3.1所示。signal描述0退出shell,按Ctrl-D时产生。1挂起(hangup),按Ctrl-S时
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纤维调施胶干燥工岗中消防知识考核试卷含答案
- 渔网具装配工客户关系管理水平考核试卷含答案
- 茶树栽培工岗位事故处理考核试卷含答案
- 有机介质电容器纸、膜切割工岗位进度管理考核试卷含答案
- 药物合成反应工安全理论能力考核试卷含答案
- 玻璃钢制品模压工安全综合考核试卷含答案
- 炼钢工安全行为能力考核试卷含答案
- 水生植物栽培工持续改进水平考核试卷含答案
- 简便运算趣味试题及答案揭晓
- 科技文考试题目及答案
- 2026年医疗行业职业道德教育培训课件
- 2026秋小学人教版美术一年级上册(新教材)教学计划含教学进度表
- 2026-2027学年八年级英语上册 Unit 1 单元测试卷(人教山西版)
- 2026年学生常见病防控培训考试题(含答案)
- 生态河道治理施工组织设计
- 【新教材】统编版(2024)九年级上册道德与法治第一单元 坚持党的全面领导(1~3课)教案
- 《物业设备设施管理(第2版)》-第一章
- 2026年法务合同管理部业务SOP执行检查表与交付一致性核验模板(含责任矩阵、异常闭环与填写示例)
- 2026年全国急救技能大赛理论测试备考题库(含答案)
- 网络与信息安全责任制及考核制度
- 废旧家电回收协议合同
评论
0/150
提交评论