




已阅读5页,还剩16页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Unix Shell 编程简介第一节 简介1.1 什么是SHELLSHELL常被看作UNIX系统的命令解释器,对于熟悉Windows用户,UNIX SHELL类似于DOS Shell,COMMAND.COM.Unix Shell 不仅仅是一个命令解释器,还是一个强大的编程语言,有着完整的条件语句循环和函数.1.2 SHELL的类型在UNIX中主要有两种主要类型的SHELL:* Bourne Shell(包括sh、ksh、 bash)* C Shell(包括csh和 tcsh)Bourne 类型的Shell的,缺省的提示符是$,如果是C类型的SHELL, 缺省的提示符是%.不同类型的Bourne Shell如下:*Bourne Shell(sh)*Korn Shell(ksh)*Bourne Again Shell(bash)*POSLX Shell不同类型的C Shell如下:*C Shell(csh)*TENEX/TOPS C Shell(tcsh)1.2.1 Bourne Shell70年代中期由 Stephen R.Bourne在AT&T贝尔实验室编写使用. Bourne Shell在多数UNIX版本中通常被安装在/bin/sh下.三个主要缺点1、没有文件名完整功能2、没有命令历史或命令编辑3、很难执行多个后台进程或任务1.2.2 C ShellC Shell 在80年代由Bill Toy在加州大学伯克利分校开发.C Shell在多数UNIX版本中通常被安装在/bin/csh下.缺点:输入输出控制比较弱缺少函数语法不清晰,比较混乱优点命令历史(Command History).用户可以重复执行以前执行过的命令,在重新执行前还可以编辑命令.别名(alias)可以为一条命令创建一个短的别名.文件名完整(file Name Completion) 只输入文件的几个字符让C Shell 自动完整文件名.任务控制(Job Controls),可以用job命令执行多个进程并控制.1.2.3 TENEX/TOPS C Shell(tcsh) 是CShell的一个新版本,可以用向上向下的方向键浏览历史命令,用左右方向键来编辑命令.1.2.4Korn Shell(ksh)Ksh 与sh 完全兼容,增加一些额外特征命令历史和历史替换命令别名和函数文件名完整数组变量内置整数运算1.2.5 Bourne Again Shell(bash)Bourne Again Shell(bash)是作为GUN的一部分开发的,也已经在linux这样的系统中取代了sh,包含了C Shell Korn Shell特征,保留了与sh语法兼容,几乎可以运行所有的Bourne Shell脚本. 注:以下解释如果没有特别指出,都是基于Bourne Shell脚本一个简单的shell Scrip文件1 #! /bin/sh2 echo “please input the number of loop:”3 read num4 while $num lt 10 5 do 6 echo $num7 num=echo :$num_1”|bc8 done解释#! /bin/sh1. 如果Script的第一个非空白字符不是#,则它会使用Bourne Shell。2. 如果Script的第一个非空白字符是#时,但不以#!开头时,则它会使用C Shell。3. 如果Script以#!开头,则#!後面所写的就是所使用的Shell,而且要将整个路径名称指出来。建议使用第三种方式指定Shell ,以确保所执行的就是所要的。Bourne Shell的路径名称为/bin/sh ,而C Shell 则为/bin/csh。#! /bin/sh必须位于脚本的第一行。以使用shell来运行脚本,如果在其他行中出现,所以shell都会把当作注释而忽略掉,在shell脚本中,注释以#开头,在#到行尾的所有的都被认为是注释。例如1. 使用Bourne Shellscript 文件开头为 echo enter filename or #!/bin/sh 2. 使用C Shell script 文件开头为# C Shell Script or #!/bin/csh 3使用perl script 文件开头为 #! /usr/bin/perl除了在Script内指定所使用的Shell 外,你也可以在命令列中强制指定。比如你要用C Shell 执行某个Script,你可以下这个命令: csh filename此时的Script的存取权就不一定要为可执行档,其内部所指定的Shell 也会无效read numnum 变量,后面有关于变量的解释while $num lt 10 do echo $num num=echo :$num_1”|bc done循环语句。后面有关的解释Script是以行为单位,我们所写的Script会被分解成一行一行来执行。而每一行可以是命令、注解、或是流程控制指令等。如果某一行尚未完成,可以在行末加上 ,这个时候下一行的内容就会接到这一行的後面,成为同一行,如下echo The message is too long so we have to split it into several lines 当Script中出现# 时,再它後面的同一行文字即为注解,Shell 不会对其翻译。 在Script中要执行一个命令的方法和在命令列中一样,你可以前景或背景执行,执行命令时也会需要设定一些环境变数在Bourne Shell中有五种方法执行一个命令,而这五种方式所产生的果有些许的不同。 1. 直接执行命令 这个方式和在命令列中直接下命令的效果一样。 2. 使用sh命令 sh command 这个command必须是Bourne Shell的Script,但这个command并不一定要设成可执行,除此之外和直接下命令的方式一样。 3. 使用.命令 . command 这时和使用sh命令相似,只不过它不像sh一般会产生新的process ,相反地,它会在原有的process 下完成工作。 4. 使用exec命令 exec command 此时这个Script将会被所执行的命令所取代。当这个命令执行完毕之後,这个Script也会随之结束。 5. 使用命令替换 这是一个相当有用的方法。如果想要使某个命令的输出成为另一个命令的参数时,就一定要使用这个方法。我们将命令列於两个 号之间,而Shell 会以这个命令执行後的输出结果代替这个命令以及两个 符号。 str=Current directory is pwd echo $str 结果如下: Current directory is /users/cc/mgtsai 这个意思是pwd 这个命令输出/users/cc/mgtsai,而後整个字串代替原来的pwd 设定str 变数,所以str 变数的内容则会有pwd 命令的输出。 number=expr $number + 1 expr命令只将运算式解,而後输出到标准输出上。如果要将某变数设定成其值,非得靠命令替换的方式不可。这个例子是将number变数的值加1 後再存回number变数。C SHELL 中执行命令基本上和Bourne Shell相同,只有一点在Bourne Shell中的. 命令在C Shell 中则为source命令第二节 变量一般变量21变量定义 变量定义的方法: name=value这种变量称为标量(scalar variable),标量一次只能存储一个值。在k shell中可以使用数组变量,可以存储多个值。2.2 变量名规定:只能包含字母(a-z 或A-Z)数字(0-9)或者下划线(_),变量名只能一字母或者下划线开头。例如下面的变量是有效的:_RUITFruit_BasketTwo_tine_2以数字开头的变量名如1、 2、 将保留给Shell使用,用户可以使用存储在这些变量中的值,但不能自己设置。在变量中不能使用 ! * - 等字符。Shell对这些字符有特殊的意义。变量值:可以使用变量存储任何值,但要注意一点,在使用带空格的值时,要用引号,例如FRUIT=”apple orange plum”FRUIT=apple orange plum2.3变量的访问值:访问存储在变量中的值,在变量前加上$符号。例如:echo FRUIT显示:FRUITecho $ FRUIT显示:apple orange plum系统变量(环境变量) 2.4和一般变量相似,只不过此种变数会将其值传给其所执行的命令。要将一般变量设定为系统变数,只要加上: export var或者 var=value export var系统默认的系统变量 $HOME 使用者自己的目录 $PATH 执行命令时所搜寻的目录 $TZ 时区 $MAILCHECK 每隔多少秒检查是否有新的信件 $PS1 在命令列时的提示号 $PS2 当命令尚未打完时,Shell 要求再输入时的提示号 $MANPATH man 指令的搜寻路径只读变量 2.5和一般变量相似,只不过这些变量不能被改变。要将一般变量设成只读的 ,只要加上: readonly var 而若只打readonly则会列出所有只读变量。还有一点,系统变数不可以设定成只读的。例如 name=Tom readonly name echo $name name=John readonly 结果如下: Tom (执行echo $name的结果) name: is read only (执行name=John的结果) readonly name (执行readonly的结果)C SHELL 中的变量定义1. 字串变量 这个部分和Bourne Shell的变量一样,只不过在设定变量值时不能使用Bourne Shell的方式,而必须打: set var=value 2. 数字运算 基本上C Shell 没有数字变量,但C Shell 却有简单的方法处理数字运算: var operator expression operator可以是C 语言中的=, +=, -=,.,而expression则是运算式。运算式的运算子如下: A. ( ) 改变计算的顺序 B. 位元NOT运算 ! 逻辑否定 C. % 取馀数 / 除 * 乘 - 减 + 加 D. 右移 大於 = 大於等於 = 小於等於 != 不等於 = 等於 F. & 位元AND运算 位元XOR运算 | 位元OR 运算 G. & 逻辑AND | 逻辑OR 除此之外,我们也可以检验一个文件的状态,如下 -n filename 而 -n可为下列之一 -d 文件是一个目录文件 -e 文件存在 -f 文件为一般的文件 -o 使用者拥有这个文件 -r 使用者可以读取这个文件 -w 使用者可以写入这个文件 -x 使用者可以执行这个文件 -z 文件长度为0 count = count + 1 flag = -e /users/cc/mgtsai/mail & -e /usr/spool/mail 3. 阵列 在C Shell 中,我们可以定义阵列变量,方式如下 set var=(val1 val2 .) 而var1之值为val1,var2之值为val2.。而$var代表整个阵列。可以用$#var 来计算阵列个数,也可以用$?var 来检查某个变量是否已定义。第三节 流控制命令在shell脚本中执行的顺序成为脚本流(flow),在多数的脚本中,需要根据用户的提供的条件或者脚本本身检测到的条件改变命令的执行,也就是改变脚本流了,也就需要对这些脚本进行流控制。在脚本中主要有两种流控制机制:if 语句case语句31 if 语句if 语句所执行的动作依赖于一个给定的条件是真还是假,if 语句的基本语法:if list1thenlist2elif list3thenlist4elselist5fi其中,elif 和else语句都是可选的,如果有elif语句则不需要else语句,反之亦然。通常,使用if语句的流控制遵循如下过程:1、 list1是条件,它被求出值2、 如果list1退出代码为真(返回代码为0),执行list2并退出if 语句3、 如果list1退出代码为假(返回代码非0),执行list3并检查退出值4、 如果list3 返回0,执行list4并退出if 语句5、 如果list3 返回非0,执行list5由于shell 将if语句看成一个清单,可以将其写为一行,如下:if list1;then list2;elif list3;then list4;else list5 ;fi;这种格式通常在较短的语句中,不建议用。常见错误1单行格式时,漏掉;运行时提示: syntax error at line x:else is not expected2使用elif 语句时漏掉then3漏掉结尾处的fi. 运行时提示: syntax error at line x :end of file unexpected3.2 使用test常见的情况是,提供给if语句的清单是一个或者多个test 命令,语法如下:test expressionexpression为test命令构造的表达式,在计算完表达式后test 返回0(真)或者返回1(假)。例如: if test f file2 then cp file2 $home else echo “not a file”fi在实际应用中一般用 把test 命令进行缩写,上面的可以写成:if f file2 then cp file2 $home else echo “not a file”fi注意:用 简写test 时 后面的空格和 前面的空格一定要有。没有空格,shell不能辨别表达式的开始和结束。test 可理解的表达式可以分为三类:文件测试字符串比较数字比较321文件测试文件测试表达式检查一个文件是不是满足一个规则格式test option fileor option file 例: if -d /usr/bin then PATH= “SPATH:/usr/bin”fi或者写为一行:If -d /usr/bin ;then PATH=”$PATH:/usr/bin”;fioption 选项如下:选项描述-d file如果文件存在并且是一个目录,则为真-h file如果文件存在并且是一个符号连接,则为真-f file 如果文件存在并且是一个规则文件,则为真-r file 如果文件存在并且可读,则问真-w file 如果文件存在并且可写,则为真-x file如果文件存在并且可执行,则为真-s file如果文件存在并且大小为0,则为真-e file 如果文件存在,则为真3.2.2 字符串比较主要是两种格式1检查是否字符串为空2检查两个字符串是否相同注意:字符串不能用test命令直接与一个表达式相比较,如果字符串与一个表达式相比较,要用case语句。格式:检查是否字符串为空test opting stringeor option strings 例如STR=If -n $STR then echo $STR else STR=” strings”fi 格式:检查两个字符串是否相同test strings1 opting strings2or strings option strings2 下面是test 命令的字符串比较选项选项描述-z string如果string长度为0,则为真-n string如果string长度不为0,则为真string1=string2如果两个字符串相同,则为真string !=string2如果两个字符串不同,则为真3.2.3数字比较格式:test int1 operator int2or int1 operator int2 例如: if $? eq 0 thenecho “command successful”elseecho “an error was encountered”exitfitest 命令的数字比较操作操作符描述int1 eq int2若int1等于 int2,则为真int1 ne int2若int1不等于 int2,则为真int1 lt int2若int1小于 int2,则为真int1 le int2若int1小于等于 int2,则为真int1 gt int2若int1大于 int2,则为真int1 le int2若int1大于等于 int2,则为真3.2.4 复合表达式为了满足图书需要,把多个表达式组合在一起,其结果成为复合表达式。可以使用test 命令的内置操作符或者使用条件执行操作符& 和 | 创建复合表达式,一般用条件执行操作符& 和 | 创建复合表达式。使用test 内置操作符创建复合表达式语法:test exp1 operator exp2or exp1 operator exp2 exp1 exp2 为有效的测试表达式,operator为 -a 或 o 操作符如下:操作符描述exp1 a exp2若exp1 exp2 都为真,则整式为真exp1 o exp2若exp1 exp2有一个为真,则整式为真使用条件操作符语法test exp1 operator exp2or exp1 operator exp2 exp1 exp2 为有效的测试表达式,operator为 & 或 |如果用&,则 exp1 exp2都为真,则整式为真如果用|,则 exp1 exp2有一个为真,则整式为真例如:if -z “$DTHOME” & -d /usr/dt thenDTHOME=/usr/dtfi等价于if -z “$DTHOME” a d /usr/dtthenDTHOME=/usr/dtfi3.2.5 否定表达式语法:test ! expor ! exp 如果exp 问假 ,则整式为真。如果exp 问真 ,则整式为假。例如if ! d $HOME/bin thenmkdir $HOME/binfi3.3 case 语句case 语句的基本语法:case word inpattern1) list1;pattern2)list2;esac这里,字符串word与每一个模式pattern进行比较直到找到一个匹配,然后执行后面的语句,如果找不到,不执行任何动作。当执行语句清单时,命令 ; 指出程序流跳到整个case语句的末尾,类似与C语言的break.在语句短时,有时是下面的格式 case word inpattern1) list1 ;pattern2) list2 ;esac例子:case “$TERM” in *term) TERM=xterm; network|diglup|unknown|vt0-90-90-9) TERM=vt100 ;esac3.4. 函数 格式如下 function-name() commands 而要调用此函数,就像在命令列下直接下命令一般。C SHELL 的流控制语法这里介绍与Bourne Shell不相同的地方。在C Shell 中流程控制不像Bourne Shell中一般需要使用test命令。相反地,它和C 语言类似只要在条件中写出表达式即可。当运算结果不为零时,其值为真,为零 时其值为假。以下是C Shell的流程控制1. if 语法如下 if (expression) simple-command 2. goto 语法如下 goto label 这时程序会跳至以label:开头的那一行执行 if ($#argv = 2) goto goodargs echo Please use two arguments. exit goodrags: . 3. if then else 这和Bourne Shell的if then, if then else, if then elif 相似。语法如下 A. if (expression) then commands endif B. if (expression) then commands else commands endif C. if (expression) then commands else if (expression) then commands else commands endif 4 switch 这和Bourne Shell的case相似。语法如下 switch (string) case pat1: commands1 breaksw case pat2: commands2 breaksw case pat3: commands3 breaksw endsw第四节 循环语句4.1 while 循环基本语法while commanddolistdone如果comamnd 和list都很短,可以写成如下单行while command; do list; done例如:DIR=while -z “$DIR” doecho “enter the name of directory:c”read DIRif ! d “$DIR” thenecho “error:not a directory”DIR=fidone4.2for 循环语法for name in word1 word2 . wordNdolistdonename 是一个变量和while循环的差别:while循环当条件满足时执行序列,推出循环;for循环变量设置成word的下一项,清单结束时,循环退出。4.3循环控制如果需要停止循环或者跳过循环的某些迭代,用循环控制命令 break 或contitune例子:while :doread CMDcase $CMD inqQ|qQ uUiItT) break ;*) process $CMD ;esacdonefor i in 1 2 3 4 5 domkdir p /home/backup/back_$iif $? eq 0 thenfor j in doc c h shdocp $HOME/docs/back_$i/*$j /home/backup/back_$iif $? ne 0 thenbreak 2fidoneelseecho “could not mkdir backup directory”fidone这是一个循环嵌套语句,从起始目录向备份目录备份文件,外循环创建目录,内循环拷贝文件,在内循环中,有一个break 2 命令,表示,拷贝发生错误时,从两个循环中退出,不仅仅只退出内循环。Contitune 类似 break ,不同之处它只从循环的当前迭代退出而不是整个循环,如果发生错误,可以执行循环的下一个迭代。例如:for FILE in $FILESdoif ! f “$FILE” thenecho “$FILE not a file “contitunefilistdone C SHELL 的循环控制语法1. foreach 这和Bourne Shell的for in相似。语法如下 foreach var (arg-list) commands end 2. while 这和Bourne Shell的while相似。语法如下 while (expression) commands end 3. break及continue 这和Bourne Shell的break 及continue相似,是用来中断foreach 及while循环。第五节 特殊参数5.1特殊参数例:#!/bin/shUSAGE=”Usage:basename $0 -c|-t file|directories”if $# -lt 2 thenecho “$USAGE”exit 1ficase $1 in-t) shiftTARGS=”-tvf”for i in “$”doif -f “$i” thenFILES=tar $TARGS “&i” 2/dev/nullif $? eq 0 thenechoecho “$i”echo “$FILES”elseecho “error : $i not a tar file”fielseecho “error : $i not a tar file”fidone;-c)shiftTARGS=” cvf”tar $TARGS archive.tar “$”;*)echo “$USAGES”exit 0;esac特殊变量解释变量描述$0正在被执行脚本程序的名字$n该变量与脚本被激活时所带的参数相对应$#提供给脚本的参数数量$* 脚本提供的所有参数$脚本提供的所有参数$?前一个命令执行后的退出状态$当前shell的进程号$!前一个后台命令的进程号basename 命令:接受一个绝对或者相对路径,返回响应的文件或者目录名字例如:basename /usr/local/bin 返回binshift 命令将第一个从参数清单中移走。$ ,$*的区别:他们的扩展参数的方式不同。使用 $* ,只简单的在不保留引用的情况下扩展每个参数,这样做会出现问题例如:mytar t “my tar file.tar”使用$*意味for 循环会调用tar 三次,分别对文件 my , tar ,file.tar各调用一次。$,扩展参数时仍将作为命令行中的引用进行。5.2 文件描述符在shell中,每一个文件都有一个被称为文件描述符的小整数代表,又成为文件句柄标准输入(STDIN) 0标准输出 (STDOUT) 1标准错误 (STDERR) 2可以利用重定向把输出或错误写进文件例如:ls l 1 ls.log 2err.logls l ls.log 2err.log将STOUT 和STERR 重定向到一个文件command file 2&1例如: ls l log 2&1list log 2&1C SHELL 的特殊变量 $argv 和Bourne Shell的$*相似,只不过这是一个阵列。 $argvn 和Bourne Shell的$n相同,但不受个数限制。 $#argv 和Bourne Shell的$#相同 $home 和Bourne Shell的$HOME相同 $path 和Bourne Shell的$PATH相似,只不过这是一个阵列 $prompt 和Bourne Shell的$PS1相同 $shell Shell的路径名称 $status 和Bourne Shell的$?相同 $ 和Bourne Shell的$相同 $ 键盘输入第六节 shell 脚本调试 执行shell脚本的基本语法 script arg1 arg2 . Argnscript: 脚本名字argn: 脚本参数执行shell脚本的常用方法/bin/sh script arg1 arg2 . Argn声明了要执行脚本的shell(这里是sh),这种方法优点是可以通过为shell提供一个参数来启动一个调试模式。使用这种脚本调试方法来启动一个调试模式的语法:/bin/sh option script arg1 arg2 . Argnoption 选项如下:选项描述-n读所有的命令,但不执行( 一般用语做语法检查)-v在读时显示所有行-x 在执行时显示所有命令和他们的参数。(常成为shell跟踪选项)在以上每个调试模式中,缺省为从脚本的第一行到最后一行都有效,如果只调试脚本的某一部分,用set 命令。语法 set option option 选项为上面所示( -n -v x )例如:for i in 1 2 3 4 5 do set -nmkdir p /home/backup/back_$iif $? eq 0 thenfor j in doc c h shdocp $HOME/docs/back_$i/*$j /home/b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农副产品数字化平台建设协议
- 2025年房地产经纪人职业资格考试模拟试卷:房地产经纪业务合同管理
- 采购框架协议4篇
- (NEW)二手车辆买卖合同3篇
- 档案托管合同书范文2篇
- 转学中学有房屋合同2篇
- 消防监控维修合同范本
- 赶工费补充合同范本
- 经济房屋赠与合同范本
- 酒店厨房团队合同(标准版)
- GB/T 13384-2008机电产品包装通用技术条件
- 粘膜免疫系统概述
- 钢板桩及支撑施工方案
- 新部编版四年级上册语文全册完整课件
- 政府信息公开申请表
- 冷藏车保温箱冰排使用记录
- FANUC工业机器人离线与应用项目7 工业机器人KAREL程序
- 综合能源管理解决方案(完整版)
- DB43∕T 291-2006 桃源大叶茶栽培技术规程
- 精细化学品化学-课件
- T∕CIS 71001-2021 化工安全仪表系统安全要求规格书编制导则
评论
0/150
提交评论