第4章Linuxshell程序设计主要内容shell的主要特点、类型、建立和执行的方式变量的分类、定义形式及引用规则各种控制语句的格式、功能及流程算术运算的使用函数的构成及使用规则内置命令4.1shell概述4.1.2shell程序示例【例4.1】由三条简单命令组成的shell程序(文件名为ex1)。$catex1datepwdcd..还有带有控制结构的shell程序,如if、for语句注意:注意:PPTPPT中凡是红色代码部分表示输入的命令,绿色代码表示输出的结果中凡是红色代码部分表示输入的命令,绿色代码表示输出的结果4.1.3shell脚本的建立和执行shell脚本的建立:利用编辑器录入和编辑,如vi通常用户不能直接执行由文本编辑器建立的shell脚本,因为直接编辑生成的脚本文件没有“执行”权限,执行执行shellshell脚本的三种方式:脚本的三种方式:(1)输入定向到shell脚本:用输入重定向方式让shell从给定文件中读入命令行,并进行相应处理;$bash脚本名(红旗版本Linux系统的默认shell是bash)例如:$bashex1(4.5.3节会详细讲解输入输出重定向)(2)以脚本名作为bash参数其一般形式是:$bash脚本名[参数]例:$bashex2/user/meng/usr/zhang优点:可以在脚本名后面带有参数,从而将参数值传递给程序中的命令,使得一个shell脚本可以处理多种情况,可以用来进行程序调试;(3)将shell脚本的权限设置为可执行,然后在提示符下直接执行它。要用chmod命令将其设置为有“执行”权限$chmoda+xex2$PATH=$PATH:.$ex2说明:第二行将当前工作目录(以“.”表示)添加到命令搜索路径中;该脚本所在的目录应被包含在命令搜索路径(PATH)中;其中$PATH表示引用变量的值;“:”是在PATH变量中,不同路径之间的分隔符;【例4.1】4.2命令历史4.2.1显示历史命令¾bash提供了命令历史的功能,即:系统为每个用户维护一个命令历史文件,其默认目录是“~/.bash_history”;其中“~”表示注册用户的主目录;¾作用便于调用、修改和快捷执行命令,把全部或部分先前命令作为新命令,予以快捷执行。语法格式是:history[option][arg…]常用的选项有:-a在历史文件中添加“新”历史命令行。-n从历史文件中读取尚未读入的历史命令行,添加到当前历史清单中。-r读取历史文件的内容,并把它作为当前的历史命令。-w把当前的历史写到历史文件中,覆盖原有内容。-c删除历史清单中所有的项。如果不带任何参数,则history命令会显示历史命令的清单如果history后给出一个正整数(如50),就只显示历史表中的昀后50行命令如果history后给出一个文件名,就把它作为历史文件名4.2.2执行历史命令执行历史命令是命令替换之一,它以字符“!”开头、后随1个或多个字符,用来定义用户所需的某种类型的历史命令,例:P87基本的事件指定字格式格式意义!!重复上一条命令,也就是“!-1”!n重新执行第n条历史命令!-n重新执行倒数第n条历史命令。!-1就等于!!!string重新执行以字符串string开头的昀近的历史命令行。!?string?重新执行昀近的、包含字符串string的那条历史命令!#到现在为止所输入的整个命令行$date一6月2621:35:18CST2006$pwd/home/mengqc$lsdesktopex1ex3exam15myfilem1$catm1echohello!$history1date2pwd3ls4catm15history$!2pwd/home/mengqc$!ccatm1echohello!$!?w?pwd/home/mengqc【例4.2】0-1.22’4.2.3用环境变量配置历史命令环境在默认方式下,bash使用用户主目录下面的文件“.bash_history”来保存命令历史注:以圆点“.”开头的文件名是隐含文件,默认方式下,使用ls命令不能把它们显示出来。用户可以通过重新为环境变量赋值,改变存放历史命令的文件$HISTFILE=/home/mengqc/.myhistory还可以重新设定能够保留的命令个数$HISTSIZE=6004.4别名4.4.1定义别名一般语法格式为:alias[name[=value]]…如果没有指定参数,将在标准输出(屏幕)上显示别名清单定义别名时,往往用单引号将它代表的内容括起来,从而防止shell对其中的内容产生歧义,如:空格和特殊字符。优点:可以简化输入,方便用户,减少出错率例:$aliasalias..=‘cd..’aliascp=‘cp-i’注意:等号两边不能有空格例:$aliasll=‘ls-l’$my=/home/mengqc(定义变量并赋值)$ll$my引用变量值要用单引号例:$aliasll=ls-lbash:alias:‘-l’notfound$pwd/home/mengqc$llm1lnm2ttt在此情况下,执行ll别名命令时,并不是执行ls–l,而是ls不用单引号的结果:【例4.3】假定/home/mengqc目录下有m1,ln,m2,ttt四个文件4.4.2取消别名如果想取消先前定义的别名,可使用如下命令:unaliasname…可以一次将所有的别名都从别名表中删除,使用如下命令:unalias-a4.5shell特殊字符4.5.1通配符1.一般通配符*(星号),它匹配任意字符的0次或多次出现?(问号),它匹配任意一个字符4.5.2引号1.双引号由双引号括起来的字符(除$、倒引号(`)和反斜线(\)外)均作均作为普通字符为普通字符对待。2.单引号由单引号括起来的字符都作为普通字符出现都作为普通字符出现3.倒引号`位于键盘的左上角倒引号括起来的字符串被shell解释为命令行,先执行该命令行,并以它的标准输出结果取代整个倒引号部分。倒引号还可以嵌套使用。注意,嵌套使用时内层的倒引号必须用反斜线(\)将其转义。【例1】$catex3echo“currentdirectoryis`pwd`”echo“homedirectoryis$HOME”echo“file*.?”echo“directory‘$HOME’”$ex3currentdirectoryis/home/zhang/proghomedirectoryis/home/zhangfile*.?directory‘/home/zhang’此时单引号作为普通字符,而非特殊字符输出是?【例2】$str=‘echo“directoryis$HOME”’$echo$strecho“directoryis$HOME”整体都作为普通字符赋值给变量str$echo‘Thetimeis`date`,thefileis$HOME/abc’Thetimeis`date`,thefileis$HOME/abc$echocurrentdirectoryis`pwd`currentdirectoryis/home/zhang$today=`date`$echoTodayis$todayTodayis一6月2621:40:18CST2006倒引号还可以嵌套使用。但应注意,嵌套使用时内层的倒引号必须用反斜线(\)将其转义。【例3】$usrnum=`echoThenumberofusersis\`who|wc-l\``$echo$usernumThenumberofusersis5此外,转义字符(即反斜线\)能把特殊字符变成普通字符:输出是?例:$echo“FilenameisNo\$\*”FilenameisNo$*4.5.3输入/输出重定向符执行一个shell命令时,通常自动打开三个标准文件,即1.标准输入文件(stdin),通常对于键盘;2.标准输出文件(stdout);3.标准出错输出文件(stderr),这两个文件都对应屏幕。在shell中,这三个文件都可以用重定向符进行重新定位11.输入重定向符.输入重定向符““””作用:把命令的标准输入定向到指定的文件一般形式是:命令文件名经常需要执行的shell命令可以放进一个文件,并且让shell从该文件读取这些命令,例如:$catcmdsecho“yourworkingdirectoryis`pwd`”echo“yournameis`logname`”echo“thetimeis`date`”who$bashcmdsShell命令解释程序将从文件cmds中读取命令,并加以执行。22.输出重定向符.输出重定向符““””作用:把命令的标准输出重新定向到指定的文件一般形式是:命令文件名如:$whoabc$catabcwho命令的输出重定向到abc文件中,屏幕上看不到执行who命令的结果,可以查看abc文件的内容即可看到。此外,shell脚本文件的输出也可以重定向到指定的文件,例如:注:执行脚本文件后,才能把重定向的目标文件显示出来,正是exp1文件的执行结果;如果不同的输出都重定向到同一文件,那么只有昀后一次执行的输出保留在文件中,原有内容被覆盖。$catexp1echo“thetimeis`date`”echo“workingdirectoryis`pwd`”echo“ithas`ls–l|wc-l`files”$exp1tmp1$cattmp1【例4】输出是?thetimeis一6月2621:43:00CST2006workingdirectoryis/home/mengqcithas26files输入和输出重新定向可以连在一起使用。例如:$wc-linfileoutfile功能是:命令wc从文件infile中输入信息,按“行”统计后的结果送到另一个文件outfile中,不在屏幕上显示。33.输出附加定向符.输出附加定向符““””把命令的标准输出附加到指定文件的后面,原有内容不变一般形式是:命令文件名如:$ps-lpsfileps命令的输出附加到psfile文件的结尾处。55.与文件描述字有关的重定向.与文件描述字有关的重定向Linux系统中每个打开的文件,都由系统赋予的一个文件描述字,是个小整数。文件打开后,用户可以直接用描述字来引用相应的文件。系统为每个进程自动打开三个标准文件标准输入、标准输出、错误输出,其文件描述字分别为0,1和2。标准错误输出也可重定向到一个文件中,其一般形式是:命令2文件名命令2文件名例:$gccm1.c2errfile功能是:对C源文件m1.c进行编译,并把编译过程中产生的错误信息重定向到文件errfile中,其中数字2表示标准错误输出的文件描述字。不能有空格4.5.4注释、管道线和后台命令11.注释:以.注释:以##开头的正文行表示注释开头的正文行表示注释如果shell脚本中第一行是以“#!”开头,则后面所跟的字符串就是所使用的shell的绝对路径名。例如:对于Cshell脚本,第一行通常是:#!/bin/csh对于bash脚本,第一行通常是:#!/bin/bash这一行说明,该脚本是用哪一种shell编写的,从而调用相应的解释程序予以执行。22.管道线.管道线管道线是由竖杠“|”隔开的若干个命令组成的序列,每个命令执行时都有一个独立的进程,前一个命令的输出是下一个命令的输入;管道线中有一类命令也成为“过滤器”,即:首先读取输入,然后将以某种简单方式进行变换,相当于过滤,再将处理结果输出,如:grep,sort,wc等命令就是过滤器;一个管道线中可以包括多条命令:ls-l$HOME|wc–lls|grepm*.c|wc–l显示当前目录中文件名是以m开头的C文件的数目该命令的功能是什么?33.后台命令.后台命令前台方式:命令提示符之后输入,立即执行后台方式:可能有些程序的执行需要花费较长时间,如:调用C编译器对C程序进行编