Shell脚本编程2Shell脚本简介一个shell脚本可以包含一个或多个shell命令,可用来自动完成通常在命令行上执行的重复循环或者复杂的工作,节省大量时间,且功能强大。脚本按行解释执行,每一行可以是命令、注解、或是流程控制指令等脚本第一行以#!开始,后面加所使用的shell(需指明整个路径名称)(如:以#!/bin/sh指定使用BourneShell)在脚本中执行一个命令的方法和在命令行中相同,可以前台或后台执行,也可设定一些环境变量注释,#后面的同一行文字为注释,解释器对此不予解释脚本的流程控制近似于一般高级语言3主要内容Shell变量变量运算流程控制输入输出应用实例4Shell变量环境变量预定义变量自定义变量位置变量5环境变量●环境变量指在操作系统中用来指定操作系统运行环境的一些参数。●环境变量设置文件:/etc/profile/etc/bashrc~/.bash_profile~/.bashrc●显示环境变量:echo$PATHset/env/export/declare●修改环境变量:exportPATH=$PATH:~/script6预定义变量●$#位置参数的数量●$*所有位置参数的内容●$?命令执行后返回的状态●$$当前进程的进程号●$!后台运行的最后一个进程号●$0当前执行的进程名7自定义变量●shell变量的开头是一个字母或下划线,后面可以接任意长度的字母、数字或下划线。大小写字母都可以,建议使用大写字母●变量名称的字符长度没有限制●变量赋值方式:变量名=值,中间没有空格,如:AUTHOR=Jerry●如果所赋的值中间有空格,需加引号,如:AUTHOR=“CharlesDarwin”●引用变量时,需在变量前加“$”号,如:echo$AUTHOR8位置变量●$0程序的文件名●$1第1个参数●$2第2个参数●…●${10}第10个参数●...9流程控制shell提供了用来控制程序执行流程的命令,用户可以用这些命令建立非常复杂的程序。与传统语言不同的是,shell用于指定条件值的不是布尔表达式而是命令和字符串控制流程包括:–条件测试–循环结构10条件测试(1)test命令:testcondition或[condition]用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试,其测试符和相应的功能分别如下:数值测试:–eq:相等–ge:数1大于等于数2–gt:数1大于数2–ne:不相等–le:数1小于等于数2–lt:数1小于数2字符串测试:=:相等!=:不相等–z字符串:空串–n字符串:非空串文件状态测试:-e文件名:文件存在-r文件名:文件存在且可读-w文件名:文件存在且可写-x文件名:文件存在且可执行-s文件名:文件存在且非空-d文件名:文件存在且为目录-f文件名:文件存在且为普通文件11条件测试(1)#!/bin/shiftest$1-gt10thenecho$1islargerthan10elseecho$1issmallerthan10fi12条件测试(2)#!/bin/shecho-n请输入一个动物的名称:readANIMALecho-n$ANIMAL有case$ANIMALin马|狗|猫)echo-n四;;人|袋鼠)echo-n两;;*)echo-n末知数目的;;esacecho腿。13循环结构(1)#!/bin/shforiin`cat$1`dogrep^$i$2done14循环结构(2)#!/bin/shwhileconditiondo–statementsdone15循环结构(3)#!/bin/shuntilconditiondo–statementsdone16输入输出●输入:readecho“Pleaseinputanumber:”readNOecho“Yourinputnumberis$NO17输入输出●输出:echoNAME=Smithecho$NAME●输出:printfprintf“%.5d\n”15●输出:cat18shell函数●在shell中还可以将一组命令集或语句组成一个可用块,即shell函数。它与shell程序形式上是相似的,不同的是它不是一个单独的进程,而是shell程序的一部分●函数定义的基本格式为:[function]函数名(){若干命令行}●调用函数的格式为:functionnameparam1param2……●shell函数可以完成某些例行的工作;可以有自己的退出状态(用return可带返回值地返回脚本中函数调用下一条语句);可以作为if、while等控制结构的条件。●在函数定义时不用带参数说明,但在调用函数时可以带有参数,此时shell将把这些参数分别赋予相应的位置参数$1、$2、...及$*19shell函数(续)例:函数返回值测试#!/bin/sh#funccheck(){if[$1=$2]thenreturn0elsereturn1fi}echo“Inputtwonumbers”readabifcheck$a$bthenechoequalelseechounequalfi20应用实例(1)●根据序列登录号(accessionno.)从GenBank中下载核酸序列:#!/bin/shGENEID=$1wget-q-O-=nucleotide&rettype=gb&id=$GENEID21应用实例(2)●文件1中包含部分拟南芥基因号(geneid),文件2中包含所有拟南芥基因号与UniGeneID的对应关系,在文件2中找出所有文件1中的基因号对应的UniGeneID:foriin`catgene_id`dogrep“^$i“At_gene2unigenedone