您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 第6章 Linux编程环境之B-Shell及编程
第6章B-Shell及编程第6章第2页主要内容主要目的编写shell脚本程序交互方式下使用shell的流程控制,编写复合命令主要内容元字符,如:引号shell的变量替换,命令替换,文件名生成shell变量流程控制子程序第6章第3页主要特点主要特点shell编程风格和C语言等算法语言的区别shell是面向命令处理的语言,提供的流程控制结构通过对一些内部命令的解释实现如同C语言设计思路一样,shell本身设计得非常精炼,但是它提供了灵活的机制shell许多灵活的功能,通过shell替换实现例如:流程控制所需的条件判断,四则运算,都由shell之外的命令完成6.1启动B-shell第6章第5页启动交互式B-shell启动方法注册shell键入sh命令进入了B-shell自动执行的批处理文件当sh作为注册shell被启动时,自动执行用户主目录下的.profile文件中命令,记作$HOME/.profile类似umask之类的命令,应当写在.profile文件中第6章第6页sh脚本的执行编辑文件lsdir(格式为文本文件)#!/bin/shif[$#=0]thendir=.elsedir=$1fifind$dir-typed–print执行这一脚本(script)文件的方法:shlsdirshlsdirchmodu+xlsdir;./lsdir/bin三种方法均启动程序/bin/sh,生成新进程6.2重定向与管道第6章第8页输入重定向filename从文件filename中获取stdin例如:sorttelno.txtword从shell获取数据直到再次遇到定界符wordcatTOAST*Now:`date`*MyHomeDirectoryis$HOMETOAST执行结果*Now:SatJul2714:47:56Beijing2006*MyHomeDirectoryis/usr/jiang定界符所界定内容加工处理(等同双引号处理):变量替换,命令替换不执行文件名生成第6章第9页输出重定向filename将stdout重定向到文件filename2filename将文件句柄2重定向到文件filename2&1将文件句柄2重定向到文件句柄1指向的文件sh允许对除0,1,2外其它文件句柄重定向第6章第10页输出重定向(例1)ls-lfile.list将命令ls标准输出stdout定向到文件file.list中cctry.c-otry2try.bugs将cc命令的stderr重定向到文件try.bugs中trytry.out2try.errtry1try.out2try.err将try程序执行后的stdout和stderr分别重定向到不同的文件第6章第11页sh输出重定向(例2)tryrpt2&1stdout和stderr均存入文件rpt0123...终端键盘0123...终端键盘rpt0123...终端键盘rpttry2&1rptstderr定向到终端,stdout重定向到文件0123...终端键盘0123...终端键盘0123...终端键盘rpt第6章第12页输出重定向(例3:源程序)缓冲I/O#includestdio.hchar*msg=Msgfromfiledescripter5\n;main(){FILE*f=fdopen(5,w);if(f)fprintf(f,%s,msg);}原始I/Ochar*msg=Msgfromfiledescripter5\n;main(){write(5,msg,strlen(msg));}第6章第13页输出重定向(例3:程序执行)编译和执行ccmsg.c-omsg./msg./msg5&1./msgrpt5&1文件句柄5重定向到文件句柄1指向的文件012345...终端键盘012345...终端键盘rpt012345...终端键盘rpt第6章第14页管道ls-l|grep'^d'前一命令的stdout作后一命令的stdincctry.c-otry2&1|more前一命令的stdout+stderr作为下一命令的stdin0123...终端键盘0123...终端键盘0123...终端键盘PIPEPIPE6.3变量第6章第16页sh变量存储的内容字符串(对于数字串来说,不是二进制形式)在执行过程中其内容可以被修改变量名第一个字符必须为字母其余字符可以是字母,数字,下划线第6章第17页变量的赋值和引用简单赋值与引用addr=20.1.1.254echo$addr注意:赋值作为单独一条命令,等号两侧不许多余空格引用addr变量$addr,echo执行前,sh完成变量替换赋值时,等号右侧字符串中含有特殊字符,unit=”BeiyouUniversity”echo$unit引用未定义变量,变量值为空字符串echoConnectto$protoNetworkproto=TCP/IPechoConnectto$protoNetwork第6章第18页命令echo语法与功能echoarg1arg2arg3...打印各命令行参数,每两个间用一空格分开,最后打印换行符不可打印字符(转义):Linux需加选项-e,(不同UNIX间兼容性差)echo支持C语言字符串常数描述格式的转义和\c\c打印完毕,不换行\b退格\n换行\r回车\t水平制表\\反斜线\nnn八进制描述的字符ASCII码举例echoBeijingChinaechoBeijingChinaecho'\065'打印5echo\\101打印Aecho\r$cnt\c“其他类似命令printf,用法与C函数printf类似,例如:printf\033[01;33mConnectto$protoNetwork$proto第6章第19页read:读用户的输入内部命令read:变量取值的另外一种方法从标准输入读入一行内容赋值给变量例:读取用户的输入,并使用输入的信息。$readnameccp.c$echo$nameccp.c$ls-l$name-rw-r--r--1jiangusr32394May2710:10ccp.c$第6章第20页脚本程序中的行编辑(1)假设应用程序myap运行时从myap.cfg中读取配置参数$catmyap.cfgID3098SERVER192.168.0.251TCP-PORT3450TIMEOUT10LOG-FILE/usr/adm/myap.log$chmodu+xconfig.ap;catconfig.ap#!/bin/shecho'InputIPaddressofservercomputer:\c'readaddredmyap.cfg/dev/nullTOAST/SERVER.diSERVER$addr.wqTOAST第6章第21页脚本程序中的行编辑(2)$./config.apInputIPaddressofservercomputer:202.112.67.213$catmyap.cfgID3098SERVER202.112.67.213TCP-PORT3450TIMEOUT10LOG-FILE/usr/adm/myap.log$第6章第22页环境变量和局部变量默认类型所创建的shell变量,默认为局部变量内部命令export局部变量转换为环境变量,例如:exportproto局部变量和环境变量shell启动的子进程继承环境变量,不继承局部变量子进程对环境变量的修改,不影响父进程中同名变量相关命令set/env内部命令set列出当前所有变量及其值包括环境变量和局部变量外部命令/bin/env列出环境变量及其值第6章第23页环境变量:shell/C程序$chmodu+xstat.report;catstat.reportechoMyComputerConnectedto$protoNetworks$ccmyap.c-omyap;catmyap.cmain(){char*envstr=getenv(”proto”);printf(”Protocolis%s\n”,envstr?envstr:“???”);}$proto=TCP/IP$./stat.report启动一个子进程shMyComputerConnectedtoNetworks$./myap启动一个子进程myapProtocolis???$exportproto$./stat.reportMyComputerConnectedtoTCP/IPNetworks$./myapProtocolisTCP/IP第6章第24页系统的环境变量创建登录后系统自动创建一些环境变量影响应用程序运行HOME:用户主目录的路径名PATH:命令查找路径与DOS不同的是,它不首先搜索当前目录PATH=/bin:/usr/bin:/etcPATH=./:/bin:/usr/bin:/etc先搜索当前目录(危险!)PATH=/bin:/usr/bin:/etc:./后搜索当前目录(危险!)PS1和PS2:主提示符和副提示符sh副提示符:当一个命令在一行内输不完需几行输入一个命令时,第2行及其它行用副提示符TERM:终端类型全屏幕操作的软件(如vi),使用它搜索终端库6.4替换第6章第26页shell替换Shell的替换工作:先替换命令行再执行命令文件名生成变量替换命令替换变量替换ls$HOMEecho”Myhomeis$HOME,Terminalis$TERM”第6章第27页shell替换:文件名生成文件名生成遵循文件通配符规则,按照字典序排列如:ls*.c文件名替换后实际执行lsa.cx.c文件太多,shell展开文件通配符*等,可能会失败辅助命令xargs从标准输入获取命令行参数xargs后面的命令可能会被执行多次,每次处理一组参数wc–l*ls|xargswc–lgrep–nHELP*.[ch]find.–maxdepth1–name‘*.[ch]’|xargsgrep–n‘HELP’第6章第28页shell替换:命令替换用反撇号now=`date`以命令date的stdout替换`date`./arg`date`实际执行./argSunDec414:54:38Beijing2006frames=`expr5+13`echo$frames18count=10count=`expr$Count+1`echo$count11第6章第29页shell内部变量:位置参数$0脚本文件本身的名字$11号命令行参数$#命令行参数的个数$*”$1$2$3$4...”$@”$1””$2””$3”…第6章第30页位置参数使用举例$catparamecho$#echoUsage:$0arg1arg2..../arg$@./arg$*$./paramCopyFilesto$HOME4Usage:./paramarg1arg2...0:[./arg]1:[Copy]2:[Files]3:[to]4:[/usr/jiang]0:[./arg]1:[CopyFilesto/usr/jiang]6.5元字符第6章第32页shell元字符(1)空格,制表符命令行参数的分隔符回车执行键入的命令|重定向与管道(还有||);用于一行内输入多个命令(还有;;)&后台运行(还有&&)$引用shell变量第6章第33页shell的元字符(2)`反向单引号,用于命令替换*[]?文件通配符(echo*与echo*不同)\取消后继字符的特殊作用(转义)若后继字符为非特殊字符,则不起作用()用于定义shell函数,以及定义命令表分隔符()|;&等除了它们自身的特殊含义外
本文标题:第6章 Linux编程环境之B-Shell及编程
链接地址:https://www.777doc.com/doc-3203649 .html