Linux操作系统第7次 shell编程_第1页
Linux操作系统第7次 shell编程_第2页
Linux操作系统第7次 shell编程_第3页
Linux操作系统第7次 shell编程_第4页
Linux操作系统第7次 shell编程_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

shell编程1.1 认识shell及shell脚本shell——命令解释器,其主要功能是负责解释和执行命令行上键入的内容。shell也提供了完善的编程能力。流行的shell有多种,如Bash、Tcsh、Ksh等。2.1认识shell及shell脚本shell作用示意图3.1认识shell及shell脚本Shell类型/bin/sh(最早的shell程序,已经被/bin/bash所取代);/bin/bash(通常情况下Linux系统默认的shell);/bin/ksh(贝尔实验室开发,兼容于bash);/bin/zsh(基于ksh开发,功能更加强大);/bin/csh(语法和C语言相似,更多的考虑了用户界面的友好性);/bin/tcsh(csh的增强版,取代csh,提供更多的功能);4.1认识shell及shell脚本Bash的重要功能命令和文件补全命令历史记录功能命令别名设置功能通配符功能作业控制、前后台控制5.1认识shell及shell脚本shellscript就像是早期批处理文件,最简单的功能就是将多条指令汇整写在一起,只需执行一次就可以轻松处理复杂的动作[root@serverroot]#vie1.sh内容如下:#!/bin/bashlsecho“Hello,world!”说明:

shell脚本是按行解释的,每个脚本的第一行总是以#!/bin/bash开头在shell脚本中,以“#”开头的行表示注释shell将忽略对该行的处理,即不进行解释、显示和执行6.认识shell及shell脚本有两种执行shell脚本程序的方法。直接执行

1给脚本e1.sh增加执行权[root@serverroot]#chmoda+xe1.sh2键入./el.sh直接执行脚本[root@serverroot]#./e1.she1.shHello,world!键入sh脚本名[root@serverroot]#she1.shHello,world!7.环境变量环境变量在用户登录时,Linux系统会自动设置一些变量,这些变量的值决定了用户的工作环境和外观,因此称为环境变量。可用“env”(environment)列出所有的环境变量及内容8.环境变量常用环境变量HOSTNAME:代表主机名称;

SHELL:当前环境下使用的shell程序,如果是bash的话,默认是/bin/bash;

HISTSIZE:记录曾经执行过的历史命令条数;

USER:用户的名称;

ENV:用户所用的个性化环境设置文件的读取文件;

HOME:代表用户的家目录,很多程序都可能会用到这个变量的值;

MAIL:当使用mail命令收信时,系统会去读取的邮件信箱文件;

PATH:执行文件搜索的路径。目录之间以冒号(:)分割,顺序很重要,决定查询顺序;

PWD:当前工作目录;

SHLVL环境变量:SHELL的层数。显示环境变量#echo$变量名9.环境变量可写的shell环境变量可以对它们进行赋值,大部分可写的shell变量都在登录过程执行/etc/profile文件时初始化用户也可以修改自己的启动文件用户目录/.bash_profile来定制自己的运行环境环境变量一般是大写的,系统启动后自动加载,可写的环境变量用户也可以随时进行修改#[root@localhost~]#echo$PS1[\u@\h\W]\$[root@localhost~]#PS1="[\u@@@\h]***"[root@@@localhost]***10.环境变量设置环境变量用户定义的普通变量通过导出也可以成为环境变量。环境变量就可以被其他的程序或下级子shell所访问。设置的命令是export,其格式如下:export变量名

[root@server~]#exportMYVAR=‘hello'[root@server~]#echo$MYVARhello11.本地用户变量本地变量一般地,shell变量不需要先定义,就可以直接为其赋值,即在赋值的同时完成变量的定义。为变量赋值的格式如下:

变量名=变量值[root@serverroot]#a=1注意:在等号的左右两边不能出现空格。12.本地用户变量当赋值的内容包含空格时,要使用“”将内容括起来,否则只将空格前面的内容赋值给该变量[jacky@bogon~]$tom=”jacky’sfather”[jacky@bogon~]$echo$tomjacky’sfather13.本地用户变量双引号中出现其它变量名时,在显示内容时会将该变量的内容显示出来,而单引号则只是原封不动的显示字符,即一些特殊字符失去意义。例如[jacky@bogon~]$name=jacky[jacky@bogon~]$test1=’$nameseven’[jacky@bogon~]$echo$test1$nameseven[jacky@bogon~]$test2=”$nameseven”[jacky@bogon~]$echo$test2jackyseven14.本地用户变量反引号括起来的字符串被shell解释为命令行[jacky@bogon~]$mydate=”mytimeis:`date`”[jacky@bogon~]$echo$mydatemytimeis:2012年3月15日星期四13:20:23CST可使用declare指令来声明变量并设置变量的属性[root@localhost桌面]#declarea=10[root@localhost桌面]#echo$a15.本地用户变量使用变量值在变量名前加上前缀“$”符号,${variable}echo${mydate} 大括号在不引起歧义的情况下也可以省略,以下例子表示使用变量时的不同情况[jacky@bogon~]$name=jacky[jacky@bogon~]$echo${name}seven 注:带有大括号相当于拼合字符串jackyseven[jacky@bogon~]$echo$nameseven 注:$name和seven间无空格,表空串[jacky@bogon~]$echo$nameseven 注:$name和seven间有空格jackyseven16.本地用户变量清除变量

使用“unset”命令将其清除[jacky@bogon~]$tom=”jacky’sfather”[jacky@bogon~]$echo$tomjacky’sfather[jacky@bogon~]$unsettom[jacky@bogon~]$echo$tom17.特殊变量特殊变量:位置变量和特定变量参数如果要向一个shell脚本传递信息,可以使用位置参数来完成。$0表示命令或shell脚本,无论脚本是否有参数,此值均可用。$1-$9表示位置参数。如果参数个数多于9个,则多出的参数将会被忽略。[jacky@bogon~]$autobak.sh/etc/home/jacky/usr/boot/opt/lib$0$1$2$3$4$5$6autobak.sh/etc/home/jacky/usr/boot/opt/lib18.特殊变量-位置参数请看以下位置参数示例:[root@servermyshell]#vie2.sh内容如下:#!/bin/bashecho$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11[root@servermyshell]#./e2.shabcdefghijka,b,c,d,e,f,g,h,i,a0,a119.特殊变量-位置参数通过shift命令可以实现位置参数的左移,其格式如下:shift[前移量]

位置参数移位示例:[root@servermyshell]#cate3.sh#!/bin/shshiftecho$1shift2echo$1[root@servermyshell]#./e3.shabcdbd20.特殊变量$#传递到shell脚本的参数个数,对上例值为6$*以一个单字符串显示所有向脚本传递的参数。上例代表”/etc/home/jacky/usr/boot/opt/lib”$$脚本运行的当前进程ID号$!后台运行的最后一个进程的进程ID号$@使用时每个参数加引号,上例代表”/etc”“/home/jacky”“/usr”“/boot”“/opt”“/lib”$-显示shell使用的当前选项,与set命令功能相同$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。特定变量参数表示的相关控制信息。21.打印特殊变量[root@servermyshell]#vispecialvar.sh#!/bin/bashecho'$#is:'$#echo'$*is:'$*echo'$?is:'$?echo'$$is:'$$echo'$0is:'$022.元字符元字符:具有特殊的含义与作用,无法像普通字符那样使用它们,如果想把它们用作普通字符(比如说在echo语句中)就需要用一个反斜杠对它们进行转换,当然也可以使用单引号“’”将元字符或者含有元字符的变量字符串括起来,同样可以达到相同的目的。元字符作用例子$取变量值$SHELL或者${SHELL}!取历史指令!3执行历史指令中的第三个指令*N个字符占位符rm*删除所有文件?1个字符占位符rma?删除a开头两个字符文件名的文件&保证指令在后台执行find/-name1.txt&()在子shell中执行一组指令(ls-l;pwd)>1.txt\禁用元字符,就是转义符\#[]含义有多种:占位,条件测试[a-z]a-z的所有字符[4=2]~用户主目录

|管道符号ls|wc{}占位符号,一组字符ls{dir1,dir2}23.变量操作read命令:用来从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。一般形式:readvarible1varible2...[jacky@bogon~]$readtestthisisatest[jacky@bogon~]$echo$testthisisatest[jacky@bogon~]$readtest1test2#输入内容第一个空格之后的内容全部赋予最后一个变量thisisatest[jacky@bogon~]$echo$test2isatest24.变量操作参数功能示例-p允许在read命令行中直接指定一个提示read-p"Enteryourname:"name-t指定read命令等待输入的秒数。当计时满时,read命令返回一个非零退出状态read-t5-p"pleaseenteryourname:"name

-n后接数字,指示read命令只要接受到该数字个字符就退出。read-n1-p"Doyouwanttocontinue[Y/N]?"answer-s能够使输入的数据不显示在监视器上(实际上只是将文本颜色设置成与背景色相同,通常用来输入密码)read-s-p"Enteryourpassword:"pass25.变量操作expr:该命令一般用于整数值,也可用于字符串。格式:exprargumentoperatorargument[jacky@bogon~]$expr3+5 #运算符两侧无空格原样输出3+5[jacky@bogon~]$expr3+5 #任何一侧无空格均会被认为是语法错误8[jacky@bogon~]$var=8[jacky@bogon~]$expr$var–5 #可以使用变量参与运算3[jacky@bogon~]$expr$var\*8 #使用“\”在“*”前避免认为其是通配符6426.学习ShellScriptshell脚本实质上就是一个文本文件,内容是多条命令和变量通过控制语句结合在一起来完成特定的功能,因此编辑shell脚本可以通过vim来实现。如使用脚本实现环境变量PATH的设置,在屏幕上显示“Ourfirstshellscript\n”提示字符串#vie4.sh

#!/bin/bash #firstshellprogram PATH=/bin:/sbin:/usr/sbin:/sur/local/bin:/usr/local/sbin:. exportPATH echo–e“Ourfirstshellscript\n” exit027.学习ShellScript通常编写一个shell命令脚本程序需要经过以下几个基本步骤:1)打开vim等文本编辑器,准备输入脚本内容;2)添加shell定义语句,使linux操作系统知道用户使用哪一种shell语言;3)编写shell命令脚本程序;4)保存命令脚本程序并退出;5)使用“chmodu+x”命令来修改这个脚本文件的权限使它可以执行;6)终端提示符后输入“./脚本名称”(或使用“sh脚本名称”)来执行该脚本;7)如执行错误进行必要调试,转步骤4)执行。28.条件判断式shell中提供了test命令来实现上述的条件测试功能。在shell脚本中条件测试既可以用在分支结构中,又可以用在循环结构中。29.条件判断式test命令(1)test命令有两种使用格式:第一种是在test语句后加上测试条件;第二种是用方括号代替test。(2)test命令的格式如下:test测试条件或[测试条件]30.条件判断式-文件测试文件测试条件示例:[root@servermyshell]#test–fe2.sh[root@servermyshell]#echo$?0功能:测试文件e2.sh是否为普通文件,测试结果为e2.sh是普通文件。[root@servermyshell]#[-fe60.sh][root@servermyshell]#echo$?131.条件判断式-文件测试要求:测试文件le2.sh是否为符号连接文件

[root@servermyshell]#ln-se2.shle2.sh[root@servermyshell]#[-Lle2.sh][root@servermyshell]#echo$?0要求:测试文件/dev/hda1是否是块设备文件。[root@servermyshell]#[-b/dev/hda1][root@servermyshell]#echo$?032.条件判断式-字符串测试string1=string2功能:字符串string1和字符串string2相等string1!=string2功能:字符串string1和字符串string2不相等-nstring1功能:字符串string1非空-zstring1功能:字符串string1为空33.条件判断式-字符串测试字符串测试示例:[root@serverroot]#echo$LOGNAMEroot[root@serverroot]#[

$LOGNAME=“root”]

[root@serverroot]#echo$?034.条件判断式-数值测试expr1–eqexpr2功能:当表达式expr1的值与表达式expr2的值相等expr1–neexpr2功能:当表达式expr1的值与表达式expr2的值不相等expr1–gtexpr2功能:当表达式expr1的值大于与表达式expr2的值expr1–ltexpr2功能:当表达式expr1的值小于与表达式expr2的值expr1–geexpr2功能:当表达式expr1的值大于等于表达式expr2的值expr1–leexpr2功能:当表达式expr1的值小于等于表达式expr2的值35.条件判断式-数值测试[root@serverroot]#a=10[root@serverroot]#b=20[root@serverroot]#declare-ic[root@serverroot]#c=$a+$b[root@serverroot]#echo$c3036.条件判断式-数值测试[root@serverroot]#[$c-eq30][root@serverroot]#echo$?0[root@serverroot]#[$c-eq"30"][root@serverroot]#echo$?0

[root@serverroot]#[$c-ne30][root@serverroot]#echo$?1[root@serverroot]#[$c-ge35][root@serverroot]#echo$?137.条件判断式-逻辑操作符shell提供的逻辑操作符有三个:一是逻辑与、二是逻辑或、三是逻辑非。38.条件判断式-与或非逻辑与操作符示例:[root@serverroot]#name=Tom[root@serverroot]#password=abc[root@serverroot]#[$name=“Tom”–a$password=“abc”][root@serverroot]#echo$?0功能:测试变量$name是否等于“Tom”并且$password是否等于“abc”。39.条件判断式-与或非示例:[root@serverroot]#ls–le3.sh-rw-r--r--1rootroot41Jan1412:16e3.sh[root@serverroot]#[-re3.sh-a-xe3.sh]

[root@serverroot]#lecho$?1功能:测试文件e3.sh是否同时具有读权限和可执行权限。

40.条件判断式-与或非[root@serverroot]#name=Tom[root@serverroot]#password=abc[root@serverroot]#[$name=“Tom”-o$password=“123456”][root@serverroot]#echo$?0

41.条件判断式-与或非逻辑非操作符示例:[root@serverroot]#ls–le3.sh-rw-r--r--1rootroot41Jan1412:16e3.sh[root@serverroot]#[-xe3.sh][root@serverroot]#echo$?1[root@serverroot]#[!–xe3.sh][root@serverroot]#echo$?0需要注意的是,逻辑非“!”的两边也必须各有一个空格。42.分支控制结构在shell中有两种形式的分支结构:一种是if分支结构,另一种case分支结构。43.分支控制结构if分支结构的基本格式如下:if

条件测试1;then条件测试1为真时的语句序列[elif条件测试2;then]条件测试2为真时的语句序列...[else]条件测试为假时的语句序列fi44.分支控制结构if分支结构示例一:用户输入字符串,判断其内容是否与存储在变量$name中的内容相同。[root@serverroot]#cate10.sh#!/bin/shname="garfield"echo-n"Pleaseinput:" readuservalueif[$uservalue=$name];then echo"same"else echo"difference"fi

45.分支控制结构执行:[root@serverroot]#./e10.shPleaseinput:abcdifference[root@serverroot]#./e10.shPleaseinput:garfieldsame46.分支控制结构if分支结构示例二:判断今天是不是星期一。[root@serverroot]#cate12.sh#!/bin/shtoday=`date+%u`if[$today=1];then echo"TodayisMonday"else echo"TodayisnotMonday"fi47.分支控制结构执行:[root@serverroot]#dateSunJan1417:12:25CST2007[root@serverroot]#./e12.shTodayisnotMonday

48.分支控制结构if分支结构示例三:判断用户指定文件的类型。[root@serverroot]#cate13.sh#!/bin/shusefile=$1if[-d$usefile];then echo"directory"elif[-f$usefile];then echo"normal"elif[-b$usefile];then echo"blockdevice"elif[-c$usefile];then echo"chardevice"else echo"other"fi49.分支控制结构执行:[root@serverroot]#./e13.she13.shnormal

50.分支控制结构case语句的结构如下:case

值in

模式1)

语句组1 ……

;;

模式2) 语句组2 …… ;; …… *) 语句组nesac51.分支控制结构case分支结构示例一:通过判断$1的值,设置用户指定文件的权限。[root@serverroot]#cate16.sh#!/bin/bashoption=$1filename=$2case$optionin r)

chmodu+r$filename ;; w) chmodu+w$filename ;; x) chmodu+x$filename ;; *) echo"error!" exit1 ;;esacexit052.分支控制结构[root@serverroot]#ls-labc-rw-r--r--1rootroot161Jan1321:36abc[root@serverroot]#./e16.shxabc[root@serverroot]#ls-labc-rwxr--r--1rootroot161Jan1321:36abc

53.分支控制结构case分支结构示例二:提示键入“y”或“n”,根据实际输入执行相应分支。#!/bin/shecho-n"Pleaseinputyourchoice[y|n]:"readchcase$chin

y|Y|yes||YES) echo"goon" ;; n|N|no|NO) echo"cancel" ;; *) echo"error,youshouldinput[y|n]"

exit1 ;;esacexit054.分支控制结构执行:[root@serverroot]#./e17.shPleaseinputyourchoice[y|n]:ygoon

55.循环结构1.for循环其典型格式如下:for变量in值1值2…值ndo

语句1

语句2……done56.循环结构for循环示例一:显示全部位置变量参数。[root@serverroot]#cate19.sh#!/bin/bashforiin$@

do echo$idone[root@serverroot]#./e19.shabc"de"abcde说明:如果省略了in,则默认从$*或$@中取值。57.循环结构for循环示例二:显示$PATH变量中各目录的名称。[root@serverroot]#cate20.sh#!/bin/bashIFS=:fordirin$PATHdols-ld$dirdoneecho"Finished!"58.循环结构执行:[root@serverroot]#./e20.shdrwxr-xr-x2rootroot4096Feb71996/usr/local/bindrwxr-xr-x2rootroot4096Feb182003/bindrwxr-xr-x2rootroot36864Aug2422:00/usr/bindrwxr-xr-x2rootroot4096Feb182003/usr/X11R6/binFinished!59.循环结构for循环示例三:与C语言相似的格式用法。[root@serverroot]#cat./e21.sh#!/bin/bashfor((i=1;i<=6;i++))dofor((j=1;j<=i;j++))doecho-e"*\c"done

echodone60.循环结构[root@serverroot]#./e21.sh*********************61.循环结构while循环的格式如下:while条件do

语句1

语句2 ……done62.循环结构while循环示例:逐行显示一个文本文件的内容,忽略以符号“#”开头的行,并在所显示的每一行前加上行号。[root@serverroot]#cate23.sh#!/bin/bashcounter=1whilereadlinedo if![${line:0:1}="#"];

then

echo"$counter:$line" counter=$[counter+1] fidone<$1

63.循环结构[root@serverroot]#./e23.she23.sh1:counter=12:whilereadline3:do4:if![${line:0:1}="#"];then5:echo"$counter:$line"6:counter=$[counter+1]7:fi8:done<$1

64.循环结构until控制结构,形式:until循环条件do

程序段done65.循环结构实现循环输入结束的字母,直到符合条件时退出循环viuntil#!/bin/bashecho"pressy/Ytostop..."readinputuntil["$input"="Y"]||["$input"="y"]do echo"errorinput,pleasetryagain..." readinputdoneecho"stophere"66.循环结构break和continuebreak命令允许跳出循环,通常在进行一些处理后退出循环或case语句continue的作用是跳出本次循环,进行下次循环,一个不带参数的continue命令只去掉本次循环的剩余代码,而continueN将会把N层循环剩余的代码都去掉,但是循环的次数不变67.循环结构#!/bin/bashforiin“x”“y”“z”doecho"$i"

forjin`seq8`#seq命令用来打印一个序列,后跟数字时从1开始

do if[$j-eq4];then break fi echo“$j” donedone68.shell函数函数的定义在shell中定义函数有两种格式:functionfuncname{shellcommands}或funcname(){shellcommands}69.shell函数定义函数示例:定义一个shell函数。[root@serverroot]#cate29.sh#!/bin/bashmyfunction(){ echo"Hello,world!"}70.shell函数调用shell函数示例:利用select循环、case语句调用定义好的函数。[root@servermyshell]#cate25.sh#!/bin/bashps_fun(){psaux}func

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论