unix- shell.doc_第1页
unix- shell.doc_第2页
unix- shell.doc_第3页
unix- shell.doc_第4页
unix- shell.doc_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

Unix系列shell程序编写(上) 来源:转载 (2006-05-25 11:27:44) *Shell是什么? 任何发明都具有供用户使用的界面。UNIX供用户使用的界面就是Shell(DOS的command熟悉吧,但UNIX的要强大的多)。 Shell为用户提供了输入命令和参数并可得到命令执行结果的环境。 为了不同的需要,UNIX提供了不同的Shell。现在的UNIX大部分都支持BourneShell,以下教程就以BourneShell(Bsh)为例,一步步的领略UNIX Shell的强大功能,占先其强大魅力,达到更方便灵活的管理、应用UNIX的目的。 1.UNIX内核和Shell的交互方法 启动UNIX时,程序UNIX(内核)将被调入计算机内存,并一直保留在内存中直到机器关闭。在引导过程中,程序 init将进入后台运行一直到机器关闭。该程序查询文件/etc/inittab,该文件列出了连接终端的各个端口及其特征。当发现一个活动的终端时,init程序调用getty程序在终端上显示login等登陆信息。(username和passwd),在输入密码后, getty调用login进程,该进程根据文件/etc/passwd的内容来验证用户的身份。若用户通过身份验证,login进程 把用户的home目录设置成当前目录并把控制交给一系列setup程序。setup程序可以是指定的应用程序,通常setup程序 为一个Shell程序,如:/bin/sh 即Bourne Shell(command出来了,呵呵)。 得到控制后,Shell程序读取并执行文件/etc/.profile以及.profile。这两个文件分别建立了系统范围内的和 该用户自己的工作环境。最后Shell显示命令提示符,如$。(这是以bsh为例,若是csh,为.cshrc,ksh为.kshrc,bash为.bashrc等等) 注:(不妨把/etc/.profile和.profile看成DOS的autoexec.bat 或 config.sys文件) 当shell退出时,内核把控制交给init程序,该程序重新启动自动登陆过程。有两种方法使shell退出,一是用户执行exit命令,二是 内核(例如root用kill命令)发出一个kill命令结束shell进程。shell退出后,内核回收用户及程序使用的资源。 用户登陆后,用户命令同计算机交互的关系为:命令进程-Shell程序-UNIX内核-计算机硬件。当用户输入一个命令,如$ls, Shell将定位其可执行文件/bin/ls并把其传递给内核执行。内核产生一个新的子进程调用并执行/bin/ls。当程序执行完毕后,内核取消 该子进程并把控制交给其父进程,即Shell程序。例如执行: $ps 该命令将会列出用户正在执行的进程,即Shell程序(下来详细说说,别急现在)和ps程序。若执行: $sleep 10 & $ps 其中第一条命令将产生一个在后台执行的sleep子进程。ps命令执行时会显示出该子进程。 每当用户执行一条命令时,就会产生一个子进程。该子进程的执行与其父进程或Shell完全无关,这样可以使Shell去做其他工作。(Shell只是把用户的意图告诉内核,然后该干嘛干嘛:) 现在windows有个计划任务(在固定的时间,日期自动执行某任务),其实UNIX很早就有这个功能了,也就是所谓的Shell的自动执行。一些UNIX 资源,如cron可以自动执行Shell程序而无需用户的参与,(这个功能好象在/var/spool/crotab目录里)。 Crontab 程序对于系统管理员来说是非常有用的。Cron 服务用于计划程序在特定时间(月、日、周、时、分)运行。我们以root的crontab 为例。根用户的 crontab 文件放在 /var/spool/crontab/root 中,其格式如下: (1) (2) (3) (4) (5) (6) 0 0 * * 3 /usr/bin/updatedb 1. 分钟 (0-60) 2. 小时 (0-23) 3. 日 (1-31) 4. 月 (1-12) 5. 星期 (1-7) 6. 所要运行的程序 2.Shell的功能和特点 1命令行解释 2使用保留字 3使用Shell元字符(通配符) 4可处理程序命令 5使用输入输出重定向和管道 6维护一些变量 7运行环境控制 8支持Shell编程 对于命令行解释就不多说了,就是在shell提示符(例如:$,%,#等)后输入一行unix命令,Shell将接收用户的输入。 使用保留字:Shell有一些具有特殊意义的字,例如在Shell脚本中,do,done,for等字用来控制循环操作,if,then等控制条件操作。 保留字随Shell环境的不同而不同。 通配符:* 匹配任何位置 ? 匹配单个字符 匹配的字符范围或列表 例如: $ls a-c* 将列出以a-c范围内字符开头的所有文件 $ls a,m,t* 将列出以e,m或t开头的所有文件 程序命令 :当用户输入命令后,Shell读取环境变量$path(一般在用户自己的.profile中设置),该变量包含了命令可执行文件可能存在的目录列表。 shell从这些目录中寻找命令所对应的可执行文件,然后将该文件送给内核执行。 输入输出重定向及管道 :重定向的功能同DOS的重定向功能: 重定向输出 当login程序激活用户shell后,将为用户建立环境变量。从/etc/profile和.profile文件中读出,在这些文件中一般都用$TERM 变量设置终端类型,用$PATH变量设置Shell寻找可执行文件的路径。 2从/etc/passwd文件或命令行启动shell时,用户可以给shell程序指定一些参数,例如-x,可以在命令执行前显示该命令及其参数。后面详细介绍这些参数。 shell编程 :本文主要介绍的内容。 shell本身也是一种语言(*可以先理解为unix命令的组合,加上类C的条件,循环等程序控制语句,类似dos批处理,但要强大的多),用户可以 通过shell编程(脚本,文本文件),完成特定的工作。 SHELL变量 下面我们详细的介绍Bourne Shell的编程: 自从贝尔实验室设计了Bourne Shell。从那时起许多厂商根据不同的硬件平台设计了许多版本得unix。但在众多版本的unix中,Bourne Shell 一直保持一致。 1Bsh的启动:用户在登陆后,系统根据文件/etc/passwd中有关该用户的信息项启动Shell。例如某用户在passwd中 的信息项为: ice_walk:!:411:103:Imsnow ,ice_walk:/home/ice_walk:/bin/bsh 则表明,用户名是ice_walk等信息,在最后一项/bin/bsh表明用户的sh环境类型是bsh,于是系统启动之。在启动或执行(包括下面我们要讲 的shell程序-脚本)过程中可以使用以下一些参数,我们一一说明: QUOTE: -a 将所有变量输出 -c string从string中读取命令 -e 使用非交互式模式 -f 禁止shell文件名产生 -h 定义 -i 交互式模式 -k 为命令的执行设置选项 -n 读取命令但不执行 -r 受限模式 -s 命令从标准输入读取 -t 执行一命令,然后退出shell -u 在替换时,使用未设置的变量将会出错 -v 显示shell的输入行 -x 跟踪模式,显示执行的命令 许多模式可以组合起来用,您可以试试了,但-ei好象不行,你说why呢? 使用set可以设置或取消shell的选项来改变shell环境。打开选项用-,关闭选项用+,多数unix允许打开或关闭a、f、e、h、k、n、 u、v和x选项。若显示Shell中已经设置的选项,执行: $echo $- Bsh中每个用户的home目录下都有一个.profile文件,可以修改该文件来修改shell环境。为了增加一个可执行文件的路径(例如/ice_walk/bin), 可以把下面代码加入.profile中 PATH=$PATH:/ice_walk/bin;exprot PATH .profile中shell的环境变量意思如下: CDPATH 执行cd命令时使用的搜索路径 HOME 用户的home目录 IFS 内部的域分割符,一般为空格符、制表符、或换行符 MAIL 指定特定文件(信箱)的路径,有UNIX邮件系统使用 PATH 寻找命令的搜索路径(同dos的config.sys的 path) PS1 主命令提示符,默认是$ PS2 从命令提示符,默认是 TERM 使用终端类型 2Bsh里特殊字符及其含义 在Bsh中有一组非字母字符。这些字符的用途分为四类:作为特殊变量名、产生文件名、数据或程序控制以及引用和逃逸字符控制。他们 可以让用户在Shell中使用最少的代码完成复杂的任务。 * Shell变量名使用的特殊字符 $# 传送给命令Shell的参数序号 $- 在Shell启动或使用set命令时提供选项 $? 上一条命令执行后返回的值 $ 当前shell的进程号 $! 上一个子进程的进程号 $ 所有的参数,每个都用双括号括起 $* 所有参数,用双括号括起 $n 位置参数值,n表示位置 $0 当前shell名 *产生文件名的特殊字符 包括*,?,,上面讲过,不再多说。 *数据或程序控制使用的特殊字符 (file) 输出重定向到文件中(没有文件则创建,有则覆盖) (file) 输出重定向到文件中(没有则创建,有则追加到文件尾部) 对于引用或逃逸的特殊字符 Bsh用单引号 和双引号 将特殊字符或由空白分隔的字引用起来组成一个简单的数据串.使用单引号和双引号的区别是双引号中的内容可进行参数和变量替换.逃逸字符也一样. $echo $HOME $PATH 结果显示$/u/ice_walk/bin:/etc:/usr/bin 而$echo $HOME $PATH 结果显示$HOME $PATH shell的逃逸符是一个,表示其后的字符不具有特殊的含义或不是shell的函数 $echo $HOME $PATH 结果显$HOME /bin:/etc:/usr/bin: 3Bsh的变量 前面我们在多个地方引用了变量,当Shell遇到一个$符时(没有被引用或逃逸),它将认为其后为一变量。不论该变量是环境变量还是用户自定义的变量,在命令行中变量名要被变量值替换。例如命令:ls $HOME将列出变量HOME对应目录下的文件。 用户可以在命令行中的任何地方进行变量替换。包括命令名本身,例如: $dir=ls $dir f* 将列出以f开头的文件。 现在详细的介绍下Bsh的变量。Bsh中有四类变量:用户定义的变量、位置变量(shell参数)、预定义变量及环境变量。 用户定义的变量: 用户定义的变量由字母和下划线组成,并且变量名的第一个字符不能为数字(09)。与其他UNIX名字一样,变量名是大小写敏感的。用户可以在命令行上用=给变量赋值,例如: $NAME=ice_walk 给变量NAME赋值为ice_walk,在应用变量NAME的时候,在NAME前加$即可,前面已说,不再废话(别说我废话多,关键是没当过老师:()。可以用变量和其他字符组成新的字,例如: $SUN=sun $echo $SUNday 在应用shell变量时候,可以在变量名字两边$后面加上,以更加清楚的显示给shell,哪个是真正的变量,以实现字符串的合并等功能。 结果显示:sunday(注意不能echo $SUNday,因为SUNday变量没定义,读者试下执行结果) 用户也可以在命令行上同时对多个变量赋值,赋值语句之间用空格分开: $X=x Y=y 注意变量赋值是从右到左进行的 $X=$Y Y=y X的值是y $X=z Y=$Z Y的值是空(变量未赋值时,shell不报错,而是赋值为空) 用户可以使用unset 命令清除给变量赋的值 用户使用变量时要在其前面加一$符,使变量名被变量值所替换。Bsh可以进行变量的条件替换,即只有某种条件发生时才进行替换。替换条件放在一对大括号中,如: $variable: -value variable是一变量值,value是变量替换使用的默认值 $echo Hello $UNAME 结果显示:Hello $echo Hello $UNAME: -there 结果显示:Hello there $echo $UNAME 结果显示: (空) $UNAME=John $echo Hello $UNAME: -there 结果显示:Hello John 可以看出,变量替换时将使用命令行中定义的默认值,但变量的值并没有因此而改变。另外一种替换的方法是不但使用默认值进行替换,而且将默认值赋给该变量。其形式如下: $variable:=value 该形式在变量替换后同时把值value符给变量variable。 $echo Hello $UNAME 结果显示:Hello $echo Hello $UNAME:=there 结果显示:Hello there $echo $UNAME 结果显示:there $UNAME=John $echo Hello $UNAME:-there 结果显示:Hello John 变量替换的值也可以是 括起来的命令: $USERDIR=$Mydir: -pwd 第三种变量的替换方法是只有当变量已赋值时才用指定值替换形式: $variable: +value 只有变量variable已赋值时,其值才用value替换,否则不进行任何替换,例如: $ERROPT=A $echo $ERROPT: +Error tracking is acitive 结果显示:Error tracking is acitive $ERROPT= $echo $ERROPT: +Error tracking is acitive 结果显示: (空) 我们还可以使用错误检查的条件进行变量替换: $variable:?message 当变量variable已设置时,正常替换。否则消息message将送到标准错误输出(若此替换出现在shell程序中,那么该程序将终止)。例如: $UNAME= $echo $ UNAME:?UNAME HAS NOT BEEN SET 结果显示:UNAME HAS NOT BEEN SET $UNAME=Stephanie $echo $ UNAME:?UNAME HAS NOT BEEN SET 结果显示:Stephanie 当没有指定message时,shell将显示一条默认的消息,例如: $UNAME= $echo $ UNAME:? 结果显示:sh:UNAME:parameter null or not set 4位置变量或Shell参数 在shell解释用户的命令时,将把命令行的第一个字作为命令,而其他的字作为参数。当命令对应的可执行文件为Shell程序时,这些参数将作为位置变量传送给该程序。第一个参数记为$1,第二个为$2.第九个为$9。其中1到9是真正的参数名,$符只是用来标识变量的替换。 位置变量$0指命令对应的可执行文件名。在后面将详细介绍位置变量。 1.只读变量 用户将变量赋值后,为了防止以后对该变量的修改,可以用以下命令将该变量设置为只读变量: readonly variable 2.export命令 shell执行一个程序时,首先为该程序建立一个新的执行环境,称为子shell。在Bourne Shell中变量都是局部的,即他们只在创建他们的Shell中有意义。用户可以用export命令让变量被其他子Shell识别。但某用户的变量是没法让其他用户使用的。 当用户启动一个新shell时,该shell将使用默认的提示符。因为赋给变量PS1的值只在当前shell中有效。为了让子Shell使用当前Shell中定义的提示符号,可以使用export命令: $PS1=Enter command: Enter command:export PS1 Enter command:sh Enter command: 此时变量PS1变成了全局变量。它可以被其子Shell使用。当变量被设置成全局的以后,将一直保持有效直到用户退出该变量所在的Shell。用户可以在文件.profile中给一个变量永久赋值。详见规范Shell。 基本语句 从本节起,我们将详细介绍Shell程序设计的基本知识,通过编写Shell脚本,用户可以根据自己的需要有条件的或者重复的执行命令。通过Shell程序,可以把单个的UNIX命令组合成一个完全实用的工具,完成用户的任务。 1什么是Shell程序 当用户在UNIX Shell中输入了一条复杂的命令,如: $ls -R /|greo myname |pg 我们可以称用户在对Shell编程,当把这条语句写在一个文件里,并且符给该文件可执行权限,那么该文件就是我们传统上说的Shell程序。 2简单的Shell程序 假设用户每天使用下述命令备份自己的数据文件: $cd /usr/icewalk;ls * |cpio -o /dev/fd0 我们可以把它写在一个文件,如:ba.sh中: QUOTE: $cat ba.sh cd /usr/icewalk ls * |cpio -o /dev/fd0 D (ctrl_d) 程序ba.sh就是Shell脚本,用户可以用vi或其他编辑工具编写更复杂的脚本。 此时用户备份文件只需要执行Shell程序ba.sh,执行时需在当前Shell中创建一个子Shell: $sh ba.sh 程序sh与用户登陆时执行的Bourne Shell相同,但当Sh命令带参数ba.sh后,它将不再是一个交互式的Shell,而是直接从文件ba.sh中读取命令。 执行ba.sh中命令的另一方法是给文件ba.sh执行权限: $chmod +x ba.sh 此时,用户可以输入文件名ba.sh做为一个命令来备份自己的数据,需要注意的是,用这种方法执行命令的时候,文件ba.sh必须存在于环境变量$PATH所指定的路径上。 Unix系列shell程序编写(中) 来源:转载 (2006-05-25 11:28:38) 3在Shell中使用数据变量 用户可以在Shell中使用数据变量,例如ba.sh程序: QUOTE: cd/usr/icewalk ls|cpio -o /dev/fd0 该程序中要备份的目录为一常量,即该程序只能用来备份一个目录。若在该程序中使用变量,则会使其更通用: QUOTE: workdir=$1 cd $workdir ls * |cpio -o /dev/fd0 通过这一改变,用户可以使用程序备份变量$workdir指定的目录。例如我们要备份/home/www的内容,只要运行ba.sh /home/www即可实现。(若不明白 $1,下面将详细介绍shell参数的传递,$1代表本sh程序-ba.sh的第一个参数) 4在Shell程序中加上注释 为了增加程序的可读性,我们提倡加入注释。在Shell程序中注释将以#号开始。当Shell解释到#时,会认为从#号起一直到该行行尾为注释。 5对Shell变量进行算术运算 高级语言中变量是具有类型的,即变量将被限制为某一数据类型,如整数或字符类型。Shell变量通常按字符进行存储,为了对Shell变量进行算术运算,必须使用expr命令。 expr命令将把一个算术表达式作为参数,通常形式如下: expr 数字 操作符 数字 由于Shell是按字符形式存储变量的,所以用户必须保证参加算术运算的操作数必须为数值。下面是有效的算术操作符: +两个整数相加 -第一个数减去第二个数 *两整数相乘 /第一个整数除以第二个整数 %两整数相除,取余数 例如: $expr 2 + 1 结果显示:3 $expr 5 - 3 结果显示:2 若expr的一个参数是变量,那么在表达式计算之前用变量值替换变量名。 $int=3 $expr $int + 4 结果显示:7 用户不能单纯使用*做乘法,若输入: $expr 4*5 系统将会报错,因为Shell看到*将会首先进行文件名替换。正确形式为: $expr 4 * 5 结果显示:20 多个算术表达式可以组合在一起,例如: $expr 5 + 7 / 3 结果显示:7 运算次序是先乘除后加减,若要改变运算次序,必须使用号,如: $int=expr 5 + 7 $expr $int/3 结果显示:4 或者: $expr expr 5+7/3 结果显示:4 6向Shell程序传递参数 一个程序可以使用两种方法获得输入数据。一是执行时使用参数。另一种方法是交互式地获得数据。vi编辑程序可以通过交互式的方法获得数据,而ls和expr则从参数中取得数据。以上两种方法Shell程序都可以使用。在交互式读入数据一节中将介绍Shell程序通过交互式的方法获得参数。 通过命令行给Shell程序传递参数可以扩大程序的用途。以前面提到的ba.sh程序为例: $cat re.sh cd $workdir cpio -i re2.sh cd $workdir cpio -i $1 re3.sh cd $workdir cpio -i $* if - then语句 QUOTE: 格式: if command1 then command2 command3 fi-(if 语句结束) command4 每个程序或命令执行结束后都有一个返回的状态,用户可以用Shell变量$?获得这一状态。if语句检查前面命令执行的返回状态,若该命令成功执行,那么在then和fi之间的命令都将被执行。在上面的命令序列中,command1和command4总要执行。若command1成功执行,command2和command3也将执行。 请看下面程序: QUOTE: #unload -program to backup and remove files cd $1 ls -a | cpio -o /dev/mnt0 rm * 该程序在备份资料后,删除档案,但当cpio命令不能成功执行时,rm命令还是把资料删除了,我们可不希望这样,为了避免此情况,可以用if - then语句: #-卸载和判断删除程序 QUOTE: cd $1 if ls -a | cpio /dev/mnt0 then rm * fi 上面程序在cpio执行成功后才删除档案 同时,若执行没有成功,我们希望得到提示,sh中的echo命令可以向用户显示消息,并显示后换行,上面程序可以写成: #-卸载和判断删除程序 cd $1 if ls -a | cpio /dev/mnt0 then echo 正删除文件资料. . rm * fi echo命令可以使用一些特殊的逃逸字符进行格式化输出,下面是这些字符及其含义: bBackspace c显示后不换行 f在终端上屏幕的开始处显示 n换行 r回车 t制表符 v垂直制表符 反斜框 0nnn 用1,2或3位8进制整数表示一个ASCII码字符 2if - then - else语句 不用多说它的作用,别的高级语言中都有,格式为: QUOTE: if command1 then command2 command3 else command4 command5 fi 在此结构中,command1中是先执行,当command1成功执行时,将执行command2和command3,否则执行command4和command5 注意看下面程序: #备份程序 cd $1 if ls -a |cpio -o /dev/mnt0 then echo 删除源资料. . rm * else echo 磁带备份失败! fi 3test命令进行条件测试 if语句可以通过测试命令执行的返回状态来控制命令的执行,若要测试其他条件,在bsh中可以使用test命令。该命令检测某一条件,当条件为真时返回0,否则返回非0值。test命令可以使Shell程序中的if语句象其他程序语言中的条件判断语句一样,具有很强的功能。 test命令的使用方法为: test condition 可测试的条件分为4类: 1)测试两个字符串之间的关系。 2)测试两个整数之间关系。 3)测试文件是否存在或是否具有某种状态或属性。 4)测试多个条件的与(and)或(or)组合。 1、条件语句test语句 1测试字符串间的关系 bsh把所有的命令行和变量都看作字符串。一些命令如expr和test可以把字符当作数字进行操作。 同样任何数字也可以作为字符串进行操作。 用户可以比较两个字符串相等或不等,也可以测试一个串是否赋了值。有关串的操作符如下: str1 = str2当两个串有相同内容、长度时为真 str1 != str2 当串str1和str2不等时为真 -n str1 当串的长度大于0时为真(串非空) -z str1 当串的长度为0时为真(空串) str1 当串str1为非空时为真 不但Shell程序可以使用test进行条件判断,test命令也可以独立执行,如: $str1=abcd $test $str1 = abcd $echo $? 结果显示:0 与上例中第一行赋值语句中的等号不同,test命令中的等号两边必须要有空格。本例test命令共有3个参数。注意两个串相等必须是长度和内容都相等。 $str1=abcd $test $str1 = abcd $echo $? 结果显示:1 上面str1包含5个字符,其中最后一个为空格符。而test命令中的另一个串只有4个字符,所以两串不等,test返回1。 不带任何操作符和使用-n操作符测试一个串结果是一样的,例如: $str1=abce $test $str1 $echo $? 结果显示:0 $test -n $str1 $echo $? 结果显示:0 但是,上面两条命令也有一点差别,反映出了使用test命令潜在的问题,请看下例: $str1= $test $str1 $echo $? 结果显示:1 $test -n $str1 $echo $? 结果显示:0 $test -n $str1 结果显示:test:argument expected 上例中,第一次测试为假因为Shell在执行命令行之前首先要进行变量替换,即把$str1换成空格,然后shell又将命令行上的空格删除,故test命令测试到的为空串。而在第二次测试中,变量替换后空格位于括号内,故不会被删除,test测试到的是一个包含空格的串,在第三次测试中,shell把空格删除,只把-n传个test命令,所以显示参数错。 2测试两个整数之间关系 test命令与expr命令一样,也可以把字符转变成整数,然后对其操作。test命令对两个数进行比较,使用的操作符如下: int1 -eq int2两数相等为真 int1 -ne int2两数不等为真 int1 -gt int2int1大于int2为真 int1 -ge int2int1大于等于int2为真 int1 -lt int2int1小于int2为真 int1 -le int2int1小于等于int2为真 下面的例子反映了字符串比较与数字比较的不同: $str1=1234 $str2=01234 $test $str1 = $str2 $echo $? 结果显示:1 $test $str1 -eq $str2 $echo $? 结果显示:0 3有关文件的测试 使用test进行的第三类测试是测试文件的状态,用户可以测试文件是否存在,是否可写以及其他文件属性。下面是文件测试时使用的选项。注意只有文件存在时,才有可能为真。 -r file用户可读为真 -w file用户可写为真 -x file用户可执行为真 -f file文件为正规文件为真 -d file文件为目录为真 -c file文件为字符特殊文件为真 -b file文件为块特殊文件为真 -s file文件大小非0时为真 -t file当文件描述符(默认为1)指定的设备为终端时为真 4复杂的条件测试(and 、or 、not) -a 与 -o 或 !非 就是组合条件了,任何高级语言中都有的(NOT 、AND 、OR),例如: $test -r em.null -a -s em.null $echo $? 结果显示:1 说明了em.null并不是可读并且非空的文件 5另一种执行test的方法 bsh中还有另一种执行test命令的方法,就是把测试条件放到一对 中,例如: $int1=4 $ $int1 -gt 2 $echo $? 结果显示:0 要注意在 的后面和 符号的前面要有一个空格。 下面我们用test命令写个简单但比较完善的程序: #- 备份程序 #- 检查参数 if $# -ne 1 then echo 请在程序名后面指出要备份文件所在目录! exit 1 fi #- 检查目录名是否有效 if !-d $1 then echo $1 不是一个目录! exit 2 fi cd $1 ls -a | cpio -o /dev/mnt0 if $? -eq 0 then rm * else echo cpio执行不成功!备份失败. exit 3 fi 6空命令 在Bsh中用 : 代表空命令,就是充个数,什么都不做 7嵌套if语句和elif结构 检查条件1 A:当条件1为真,则执行一部分操作 B:若条件1为假,检查条件2 1)若条件2为真,执行另外一部分操作 2)若条件2为假,检查条件3 3)若条件3为真,执行其他一部分操作 语法如下: if command then command else if command then command else if command then command fi fi fi 8elif语句 嵌套if语句有时会给用户带来混乱,特别是什么时候fi语句很难判断。因此Bourne Shell又提供了elif语句。elif是else-if的缩写,它表示是if语句的继续。格式为: if command then command elif command then command elif command then command fi 上面介绍的嵌套if语句和elif语句完成相同的功能,用户可以根据自己的喜好选择一种使用。 9case语句 前面说的elif语句替代if-then-else语句,但有时在编程时还会遇到对同一变量进行多次的测试,该情况可以用多个elif语句实现,但还有一种更简单的方法就是用case语句。 case语句不但取代了多个elif和then语句,还可以用变量值对多个模式进行匹配,当某个模式与变量值匹配后,其后的一系列命令将被执行,下面是case语句使用的语句。 case value in pattem 1) command command; pattem 2) command command; . pattem) command; esac case语句只执行其中的一组命令,当变量值与多个模式相匹配时,只有第一个匹配的模式对应的命令被执行。;表示该模式对应的命令部分程序。 通

温馨提示

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

评论

0/150

提交评论