《第6章 B-Shell及编程.ppt》由会员分享,可在线阅读,更多相关《第6章 B-Shell及编程.ppt(71页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第6章章 B-Shell及编程及编程主要内容主要内容n主要目的主要目的u编写shell脚本程序u交互方式下使用shell的流程控制,编写复合命令n主要内容主要内容u元字符,如:引号ushell的变量替换,命令替换,文件名生成ushell变量u流程控制u子程序2主要特点主要特点n主要特点主要特点ushell编程风格和C语言等算法语言的区别ushell是面向命令处理的语言,提供的流程控制结构通过对一些内部命令的解释实现u如同C语言设计思路一样,shell本身设计得非常精炼,但是它提供了灵活的机制shell许多灵活的功能,通过shell替换实现例如:流程控制所需的条件判断,四则运算,都由shell
2、之外的命令完成36.1 启动启动B-shell启动交互式启动交互式B-shell n启动方法启动方法u注册shellu键入sh命令进入了B-shelln自动执行的批处理文件自动执行的批处理文件u当sh作为注册shell被启动时,自动执行用户主目录下的.profile文件中命令,记作$HOME/.profile类似umask之类的命令,应当写在.profile文件中5sh脚本的执行脚本的执行n编辑文件编辑文件lsdir(格式为文本文件格式为文本文件)#!/bin/shif$#=0 then dir=.else dir=$1fifind$dir-type d printn执行这一脚本执行这一脚本(
3、script)文件的方法文件的方法:ushlsdirush lsdiruchmod u+x lsdir;./lsdir/bin三种方法均启动程序/bin/sh,生成新进程66.2 重定向与管道重定向与管道输入重定向输入重定向nfilename u从文件filename中获取stdinu例如:sort telno.txtnword 从从shell获取数据直到再次遇到定界符获取数据直到再次遇到定界符wordcat filenameu将stdout重定向到文件filenamen2 filenameu将文件句柄2重定向到文件filenamen2&1u将文件句柄2重定向到文件句柄1指向的文件nsh允许对
4、除允许对除0,1,2外其它文件句柄重定向外其它文件句柄重定向9输出重定向输出重定向(例例1)nls-l file.listu将命令ls标准输出stdout定向到文件file.list中ncc try.c-o try 2 try.bugsu将cc命令的stderr重定向到文件try.bugs中ntry try.out 2try.err try 1 try.out 2try.erru将try程序执行后的stdout和stderr分别重定向到不同的文件10sh输出重定向输出重定向(例例2)ntry rpt 2&1ustdout和stderr均存入文件rptntry 2&1 rptustderr定向到
5、终端,stdout重定向到文件11输出重定向输出重定向(例例3:源程序源程序)n缓冲缓冲I/O#include char*msg=Msg from file descripter 5n;main()FILE*f=fdopen(5,w);if(f)fprintf(f,%s,msg);n原始原始I/Ochar*msg=Msg from file descripter 5n;main()write(5,msg,strlen(msg);12输出重定向输出重定向(例例3:程序执行程序执行)n编译和执行编译和执行cc msg.c-o msg./msg./msg 5&1n./msg rpt 5&1u文件句柄
6、5重定向到文件句柄1指向的文件13管道管道n ls -l|grep d 前一命令的stdout作后一命令的stdinn cc try.c-o try 2&1|more 前一命令的stdout+stderr作为下一命令的stdin146.3 变量变量sh变量变量n存储的内容存储的内容u字符串(对于数字串来说,不是二进制形式)u在执行过程中其内容可以被修改n变量名变量名u第一个字符必须为字母u其余字符可以是字母,数字,下划线16变量的赋值和引用变量的赋值和引用n简单赋值与引用简单赋值与引用uaddr=20.1.1.254 uecho$addr 注意:赋值作为单独一条命令,等号两侧不许多余空格引用a
7、ddr变量$addr,echo执行前,sh完成变量替换n赋值时,等号右侧字符串中含有特殊字符,赋值时,等号右侧字符串中含有特殊字符,uunit=”Beiyou University”uecho$unitn引用未定义变量,变量值为空字符串引用未定义变量,变量值为空字符串uecho Connect to$proto Networkuproto=TCP/IPuecho Connect to$proto Network17命令命令echon语法与功能语法与功能echo arg1 arg2 arg3.打印各命令行参数,每两个间用一空格分开,最后打印换行符n不可打印字符不可打印字符(转义转义):Linux
8、需加选项需加选项-e,(不同不同UNIX间兼容性差间兼容性差)uecho支持C语言字符串常数描述格式的转义和c c 打印完毕,不换行 b 退格 n 换行 r 回车 t 水平制表 反斜线 nnn 八进制描述的字符ASCII码u举例echo Beijing Chinaecho Beijing Chinaecho 065 打印5echo 101 打印Aecho r$cnt c“n其他类似命令其他类似命令printf,用法与用法与C函数函数printf类似类似,例如:例如:uprintf 03301;33mConnect to$proto Network$proto18read:读用户的输入读用户的输
9、入n内部命令read:变量取值的另外一种方法u从标准输入读入一行内容赋值给变量u例:读取用户的输入,并使用输入的信息。$read name ccp.c$echo$nameccp.c$ls-l$name-rw-r-r-1 jiang usr 32394 May 27 10:10 ccp.c$19脚本程序中的行编辑脚本程序中的行编辑(1)假设应用程序myap运行时从myap.cfg中读取配置参数$cat myap.cfg ID 3098SERVER 192.168.0.251TCP-PORT 3450TIMEOUT 10LOG-FILE/usr/adm/myap.log$chmod u+x con
10、fig.ap;cat config.ap#!/bin/shecho Input IP address of server computer:cread addred myap.cfg /dev/null file listvi 2&1echo Unix System V 与 echo Unix System Vecho*与 echo*echo$HOME 与 echo$HOMEecho A 与 echo Aecho Windows Directory is C:WindowsWORK.DIRecho Windows Directory is C:WindowsWORK.DIR 34元字符:引号元
11、字符:引号n双引号双引号 u除$和外特殊字符的特殊含义被取消u需要的转义“$uecho*与echo*“n 单引号单引号 u对所括起的任何字符,不作特殊解释uecho My home dir is$HOMEuecho My home dir is$HOME35转义符与引号及反撇号转义符与引号及反撇号n配对的双引号中配对的双引号中u 代替双引号自身u 代表反斜线自身u 代替反撇号自身u$代表美元符自身u其它情况下的反斜线保持原文不变echo A与echo Aecho$与echo$n配对的反撇号中配对的反撇号中u 代表反斜线自身u 代替反撇号自身u其它情况下的反斜线保持原文不变n配对的单引号配对的单
12、引号u 代表反斜线自身u不许任何转义,不许出现单引号36转义符使用举例转义符使用举例$echo Dont remove Peters DOS dir C:PETER!Dont remove Peters DOS dir C:PETER!$echo jiangs$HOME is$HOMEjiangs$HOME is/usr/jiang$echo pipeline is commands separated by|pipeline is commands separated by|37反撇号内的转义处理反撇号内的转义处理 例:给出程序名字,中止系统中正在运行的进程$ps-e|grep myap 3
13、1650 pts/2 0:00 myap$kill 31650ps-e|awk/0-9:0-90-9 myap$/printf(%d,$1)ps-e|awk/0-9:0-90-9$1$/printf(%d,$1)kill ps-e|awk/0-9:0-90-9$1$/printf(%d,$1)$cat kPIDs=ps-e|awk/0-9:0-90-9$1$/printf(%d,$1)echo kill$PIDskill$PIDs$chmod u+x k$ps-e|grep myap27248 pts/2 0:00 myap31714 pts/2 0:00 myap36926 pts/2 0:
14、00 myap$./k myapkill 27248 31714 36926386.6 条件判断条件判断条件条件n条件判定的依据条件判定的依据u判定一条命令是否执行成功,判断方法:命令执行的返回码,0:TRUE(成功),非0:FALSE(失败)$ls-d xyzxyz$echo$?$?上一命令的返回码,shell自定义变量0$ls-d xyz1xyz1:not found$echo$?2n用管道线连接在一起的若干命令的执行返回码用管道线连接在一起的若干命令的执行返回码为最后一个命令执行的返回码为最后一个命令执行的返回码40最简单的条件判断最简单的条件判断用用&或或|连结两个命令连结两个命令nc
15、md1&cmd2 u若cmd1执行成功(返回码为0)则执行cmd2,否则不执行cmd2ncmd1|cmd2 ucmd1执行失败(返回码不为0)则执行cmd2,否则不执行cmd2$ls-d xdir/dev/null&echo FOUNDFOUND若没有目录ydir$ls-d ydir/dev/null 2&1|echo No ydirNo ydir41命令命令true与与falsen/bin/trueu返回码总为0n/bin/falseu返回码总不为0n有的有的shell为了提高效率,将为了提高效率,将true和和false设置为设置为内部命令内部命令42命令命令test与与n区别区别u命令/
16、usr/bin/要求其最后一个命令行参数必须为u除此之外/usr/bin/与/usr/bin/test功能相同 Linux中/usr/bin/是一个指向test的符号连接u注意:不要将方括号理解成一个词法符号u举例test-r/etc/motd -r /etc/motd 43命令命令test:文件特性检测:文件特性检测n文件特性检测文件特性检测u-f 普通文件 u-d 目录文件 u-r 可读 u-w 可写u-x 可执行u-s size0 n例例test-r/etc/motd&echo readable-r/etc/motd&echo readable44命令命令test:字符串和整数:字符串和
17、整数n字符串比较字符串比较u-n str str串长度大于0u str1 =str2 str1与str2串相等 u str1 !=str2 str1串与str2串不等n注意注意:等号和不等号两侧的空格不可少等号和不等号两侧的空格不可少u-n$a|echo a=NULL 注意:$a的引号 utest$#=0&echo No argumentn整数的比较整数的比较u-eq -ne u-gt -ge u-lt -le n例例:utest ls|wc-l-ge 100&echo Too many files45命令命令test:逻辑运算:逻辑运算n逻辑运算逻辑运算u!NOT(非)u-o OR(或)u-
18、a AND(与)n例例:u!-d$cmd-a-x$cmd&$cmdu注意:必需的空格不可省略$cat hereecho”count=$#”$#=2&echo Here$./here*.ccount=9Here46复合命令复合命令n复合命令:条件满足时,执行若干个命令复合命令:条件满足时,执行若干个命令u使用 或者()pwd DIR=/usr/bin-d$DIR&cd$DIR echo”Current Directory is pwd”echo”ls|wc-l files”pwdn执行结果执行结果/usr/jiangCurrent Directory is/usr/bin400 files/us
19、r/bin47 与与()n与与()的书写规则的书写规则u(list)在子shell中执行命令表listu list;在当前shell中执行命令表list注意:左花括号后面必须有一个空格n与与()的区别的区别u如果将上例中的 改成(),那么执行结果如下:/usr/jiangCurrent Directory is/usr/bin400 files/usr/jiang48复合命令:举例复合命令:举例n使用使用时时,多行并为一行不要漏掉必需的空格,多行并为一行不要漏掉必需的空格和分号和分号-f core&echo rm core rm core写成一行应当为写成一行应当为-f core&echo r
20、m core;rm core;49条件结构条件结构ifn语法语法if condition then listelif condition then listelse listfiu其中if/then/elif/else/fi为关键字(内部命令)u当条件判断后需要两个或多个分支时,&和|就不够了,这时应当用if结构50条件结构条件结构if:举例:举例$cat errmonitorLOGFILE=./errlogdate$LOGFILEif test-w errfilethen cat errfile$LOGFILE rm errfileelse echo”No error”$LOGFILEfiu
21、then行可和cat行合并成一行uif行不可以和then行直接合并成一行u将两行合并:分号使得一行内可以输入多条命令 if test-r errfile;then51case结构结构n基于文件名匹配基础上的多条件分支,语法基于文件名匹配基础上的多条件分支,语法:case word in pattern1)list1;pattern2)list2;.esacuword与pattern匹配:使用shell的文件名匹配规则u;是一个整体,不能在两分号间加空格,也不能用两个连续的空行代替u可以使用竖线表示多个模式uword与多个模式匹配时,执行遇到的第一个命令表52case结构:举例结构:举例n语法语
22、法case$1 inSTART|start).(一段程序);STOP|stop).(一段程序);*)echo Usage:$0 start|stop ;esacn注意:本例中注意:本例中case句中句中$1要加上双引号要加上双引号536.7 循环结构循环结构while结构结构n语法语法while condition do listdonen例例1while test-r lockfiledo sleep 5donen下例有错下例有错while test-r lockfile do sleep 5donen例例2while -r lockfile;do sleep 5;done55命令命令exp
23、r:表达式计算:表达式计算n功能:求功能:求表达式的值表达式的值ushell本身不提供数学运算和字符串运算的能力,这些运算借助命令expr完成n算数运算算数运算u+-*/%()n注意注意u应该转义的地方必须加反斜线转义u应该有空格的地方不允许漏掉。n例例1:求变量求变量a*(b+c)u正确的写法为 expr$a*($b+$c)56命令命令expr:算数运算:算数运算(例例)if$#=0 then echo Usage:$0:else count=$1 while$count-gt 0 do count=expr$count-1 echo-e 015$count c sleep 1 done f
24、i57命令命令expr:字符串运算:字符串运算n用法用法:expr string :patternu正则表达式pattern匹配字符串string,打印匹配长度upattern中用(和)括起一部分,能匹配时打印括号内能匹配的部分,否则为空字符串n举例举例expr 123:0-9*结果为3expr A123:0-9*结果为0n举例举例uping-c 1 192.168.0.1命令成功时输出如下PING 192.168.0.1(192.168.0.1)56(84)bytes of data.64 bytes from 192.168.0.1:icmp_seq=0 ttl=64 time=0.806
25、 ms-192.168.0.1 ping statistics-1 packets transmitted,1 received,0%packet loss,time 0msrtt min/avg/max/mdev=0.806/0.806/0.806/0.000 ms,pipe 2从中提取的RTT时间0.806msexpr ping-c 1 192.168.0.1:.*time=(0-9.*)ms$58命令命令expr:字符串运算:字符串运算(例例)n设设tty命令输出类似命令输出类似/dev/tty6的结果的结果expr tty:/dev/tty(.*)expr tty:/dev/tty(.
26、*)termno=expr tty:/dev/tty(.*)expr$unit:.*返回变量unit的长度expr pwd:.*/(/*)$截取路径名的最后一个分量59for结构结构n语法语法1for name in word1 word2.do listdonen语法语法2for name do listdone相当于for name in$1$2.do listdonen命令命令seq for i in seq 1 254;do ping-c 1 192.168.0.$i;done60for结构:程序举例结构:程序举例1n例例1:一段开机时自动执行的批处理程序:一段开机时自动执行的批处理程
27、序if -d/etc/rc.d then for cmd in /etc/rc.d/*/*/etc/rc.d/*do !-d$cmd-a-x$cmd&$cmd donefi61for结构:程序举例结构:程序举例2n例例2:将命令行参数逆序显示出来:将命令行参数逆序显示出来list=”for argdo list=”$arg$list”doneecho”$list”62breakn内部命令内部命令breaku循环结构for/while中使用,中止循环例例:将命令行参数逆序输出将命令行参数逆序输出count=$#cmd=echowhile truedo cmd=”$cmd$count”count=
28、expr$count-1$count-eq 0&breakdoneeval$cmdn内部命令内部命令evalu将实参作为shell的输入读入,再经过一轮变量替换/文件名生成/命令替换后,执行所得的命令63continuen内部命令内部命令continueu在循环结构for/while中使用,提前结束本轮循环例例:将命令行参数逆序输出将命令行参数逆序输出count=$#cmd=echowhile truedo cmd=”$cmd$count”count=expr$count-1$count-gt 0&continue eval$cmd exit 0 donen内部命令内部命令exitu终止当前s
29、hell进程646.8 函数函数shell函数函数n语法语法name()list;n参数参数u调用时函数名后附加上0到多个参数u在函数体内部以$1,$2,.或$*,$方式引用n返回值返回值u函数体内用return使函数有返回码,返回码0代表成功,非零表示失败u函数内部可以创建和修改变量,函数返回后其它程序访问66Shell的注释的注释nshell中使用中使用#号作注释号作注释u#号出现在一个单词的首部,那么,从#号至行尾的所有字符被忽略67shell函数举例函数举例get_val()#Usage:get_val 变量名 提示 默认值 取值表 while true do echo-e$2$3:c
30、;read val$val=&val=$3 for i in$4 do$val=$i&break 2 done echo*Invalid choice$val,must be in$4 done eval$1=$val#main()get_val INTR Interrupt Number 10 5 10 11 12 14 get_val PORT I/O Base Address 800 512 560 800 get_val BAUD Baud Rate 9600 2400 9600 57600 echo INTR=$INTR PORT=$PORT BAUD=$BAUD686.9 shel
31、l开关和位置变量开关和位置变量shell内部开关内部开关nshell内部开关内部开关u-x 执行命令前打印出shell替换后的命令及参数,为区别于正常的shell输出,前面冠以+号u+x 取消上述设置u-u 当引用一个未定义的变量时,产生一个错误u+u 当引用一个未定义的变量时,认为是一个空串70shell内部开关程序举例内部开关程序举例n例:例:cat chmod1set-xecho$*for ido -f$i&chmod a+r$i eoho$i is readable donen内部开关的设置方法内部开关的设置方法uset-x也可以省略,使用命令sh-x chmodl a*u交互式shell也可以使用set-x/set+xu使用shell的-x选项对shell程序调试非常有用71