shell编程 (2).pdf





《shell编程 (2).pdf》由会员分享,可在线阅读,更多相关《shell编程 (2).pdf(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、SHELL 编程编程 目录目录 一、Shell 语法.2 1.2、数组声明和使用 name0=Tom.2 1.3、特殊的变量.2 1.4、运算和运算符.5 1.4.1、整数运算符.5 1.4.2、逻辑运算符.6 1.5、流程语句.7 1.5.2、case 语句.7 1.5.3、select 语句.8 1.6、循环语句.9 1.6.2、while 语句.9 1.6.3、breake 和 continue.10 二、函数.11 三、shell 程序调试.12 四、信号.13 五、bash 中常用的命令.13 一、一、Shell 语法语法 1.1、变量声明、变量声明 变量值(注意:等号两侧不能有空格
2、)a=”hello”b=9 unset a 撤销变量 a readonly a=2 声明静态的变量 a=2,不能 unset export 变量名 可把变量提升为全局环境变量,可供其他 shell 程序使用 变量应用中要注意:echo$1=$1;$2=$2;屏蔽$1,屏蔽$2,直接显示$1,$2,同理*也屏蔽了*的通配符作用$SATday,变量要与字符串连在一起时,应该用$a=ls-al 反引号,运行里面的命令,并把结果返回给变量 a a=$(ls-al)等价于反引号 单引号和双引号“”的区别,单引号完全屏蔽$a 变量,双引号不屏蔽$a,单引号和双引号都屏蔽*的通配符作用。1.2、数组声明和使
3、用、数组声明和使用 name0=Tom name1=Tomy name2=John 或 name=(Tom Tomy John)例子:#!/bin/bash name=(Tom Tomy John)for i in 0 1 2 do echo$i:$name$i 1.3、特殊的变量、特殊的变量$0:脚本名字。此变量包含地址,可以使用 basename$0 获得脚本名称。$1:第一个参数$2,$3,$4,$5,.一次类推。$#传递到脚本的参数个数$*以一个单字符串显示所有向脚本传递的参数,,以($1$2.)$脚本运行的 ID 号$!后台运行的最后一个进程的 ID 号$与$*相同,但是使用时加引号
4、,并在引号中返回每个参数。($1$2.)$-显示 shell 使用的当前选项。$?显示最后命令的推出状况。0 表示没有错误。例子:#!/bin/sh if$#-ne 2 ;then echo Usage:$0 string file;exit 1;fi grep$1$2;if$?-ne 0 ;then echo Not Found$1 in$2;exit 1;fi echo Found$1 in$2;上面的例子中使用了$0$1$2$#$?等变量,下面是程序的解释:判断运行参数个数,如果不等于 2,显示使用用法帮助,其中$0 表示就是脚本自己。用 grep 在$2 文件中查找$1 字符串。判断前
5、一个命令运行后的返回值(一般成功都会返回 0,失败都会返回非 0)。如果没有成功显示没找到相关信息,否则显示找到了。其中表示转义,在 里面还需要显示号,则需要加上转义符 参数置换的变量 1、变量=$参数:-word:如果设置了参数,则用参数的值置换变量的值,否则用 word 置换。即这种变量的值等于某一个参数的值,如果该参数没有设置,则变量就等于 word 的值。-z$COLUMNS:-&COLUMNS=80 2、变量=$参数:=word:如果设置了参数,则用参数的值置换变量的值,否则把变量设置成 word,然后再用 word 替换参数的值。注意,位置参数不能用于这种方式,因为在 Shell
6、程序中不能为位置参数赋值。3、变量=$参数:?word:如果设置了参数,则用参数的值置换变量的值,否则就显示 word 并从 Shell 中退出,如果省略了 word,则显示标准信息。这种变量要求一定等于某一个参数的值。如果该参数没有设置,就显示一个信息,然后退出,因此这种方式常用于出错指示。4、变量=$参数:+word:如果设置了参数,则用 word 置换变量,否则不进行置换。字符串匹配的操作:$PARAMETER#WORD shell 像文件名扩展中那样扩展 WORD,并从 PARAMETER 扩展后的值的开头删除最短的匹配模式(若存在匹配模式的话)。使用 或$即可删除列表中每个参数的模式
7、。$PARAMETER#WORD 导致从开头删除最长的匹配模式而不是最短的匹配模式。$PARAMETER%WORD shell 像文件名扩展中那样扩展 WORD,并从 PARAMETER 扩展后的值末尾删除最短的匹配模式(若存在匹配模式的话)。使用 或$即可删除列表中每个参数的模式。$PARAMETER%WORD 导致从末尾删除最长的匹配模式而不是最短的匹配模式。$PARAMETER/PATTERN/STRING shell 像文件名扩展中那样扩展 PATTERN,并替换 PARAMETER 扩展后的值中最长的匹配模式(若存在匹配模式的话)。为了在 PARAMETER 扩展后的值开头匹配模式,
8、可以给 PATTERN 附上前缀#,如果要在值末尾匹配模式,则附上前缀%。如果 STRING 为空,则末尾的/可能被忽略,匹配将被删除。使用 或$即可对列表中的每个参数进行模式替换。$PARAMETER/PATTERN/STRING 对所有的匹配(而不只是第一个匹配)执行替换。變數設定方式 str 沒有設定 str 為空字串 str 已設定非為空字串 var=$str-expr var=expr var=var=$str var=$str:-expr var=expr var=expr var=$str var=$str+expr var=var=expr var=expr var=$str:
9、+expr var=var=var=expr var=$str=expr str=expr var=expr str 不變 var=str 不變 var=$str var=$str:=expr str=expr var=expr str=expr var=expr str 不變 var=$str var=$str?expr expr 輸出至 stderr var=var=str var=$str:?expr expr 輸出至 stderr expr 輸出至 stderr var=str ianpinguino$x=a1 b1 c2 d2 ianpinguino$echo$x#*1 b1 c2
10、d2 ianpinguino$echo$x#*1 c2 d2 ianpinguino$echo$x%1*a1 b ianpinguino$echo$x%1*a ianpinguino$echo$x/1/3 a3 b1 c2 d2 ianpinguino$echo$x/1/3 a3 b3 c2 d2 ianpinguino$echo$x/?1/z3 z3 z3 c2 d2 字符串子集提取:$x:3:5 的值就是“e val”,清单 9.shell 参数值的子字符串 ianpinguino$x=some value ianpinguino$echo$x:3:5 e val 字符串长度:您已经知道$
11、#表示参数的数量,而$PARAMETER:OFFSET:LENGTH 扩展适用于单个参数以及$*和$,因此,可以使用一个类似的结构体$#PARAMETER 来确定单个参数的长度也就不足为奇了。清单 10 中所示的简单的 testlength 函数阐明了这一点。自己去尝试使用它吧。清单 10.参数长度 ianpinguino$testlength()for p in$;do echo$#p;done ianpinguino$testlength 1 abc def ghi 1 3 7 1.4、运算和运算符、运算和运算符 1.4.1、整数运算符、整数运算符 整数的算术运算符 +*/%赋值运算符 *
12、/位运算符&|位运算赋值运算符&|逻辑运算符:&|!小于-lt shift by 2 -)shift;break;#end of options -*)echo error:no such option$1.-h for help;exit 1;*)break;esac done 就像平常执行命令一样,当有参数-h 时,则执行相应的动作 1.6.3、breake 和和 continue 关键字break 用来跳出循环。而关键字”continue”用来不执行余下的部分而直接跳到下一个循环。1.6.4、shiftshift 将存放在位置变量中的命令行参数,依次向左传递.例如 位置变量当前值为:$1
13、=file1$2=file2$3=file3 执行一次 shift 命令后,位置变量的值为:$1=file2$2=file3 还可以在 shift 命令中指定位置变量转移的次数,如:shift n 例子:while$1 do if$1=-i then infile=$2 shift 2 else if$1=-o then outfile=$2 shift 2 else echo Program$0 does not recognize option$1 fi done tr a-z A-Z$outfile 二、函数二、函数 脚本 b2d 将二进制数(比如 1101)转换为相应的十进制数。这也是
14、一个用 expr命令进行数学运算的例子:#!/bin/sh#vim:set sw=4 ts=4 et:help()cat newtext.fileawk:awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F 指定其他分割符。cat file.txt|awk-F,print$1,$3 这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下:Adam Bor,34,IndiaKerryMiller,22,USA命令输出结果为:Adam Bor,IndiaKerry Miller,USA2)概念:管道,重定向和 backtick这些不是系统命令,但是他们真的
15、很重要。管道(|)将一个命令的输出作为另外一个命令的输入。grep hello file.txt|wc-l在file.txt 中搜索包含有”hello”的行并计算其行数。在这里grep 命令的输出作为wc命令的输入。当然您可以使用多个命令。重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。写入文件并覆盖旧文件 加到文件的尾部,保留旧文件内容。反短斜线:使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。命令:find.-mtime-1-type f-print用来查找过去24 小时(-mtime 2则表示过去48小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可
16、以使用以下脚本:#!/bin/sh#The ticks are backticks()not normal quotes():tar-zcvf lastmod.tar.gz find.-mtime-1-type f-print3)流程控制if 表达式 如果条件为真则执行then后面的部分:if.;then .elif.;then .else .fi大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等通常用 来表示条件测试。注意这里的空格很重要。要确保方括号的空格。-f somefile :判断是否是一个文件-x/bin/ls :判断/bin/ls是
17、否存在并有可执行权限-n$var :判断$var变量是否有值$a=$b :判断$a和$b 是否相等执行man test 可以查看所有测试表达式可以比较和判断的类型。直接执行以下脚本:#!/bin/shif$SHELL=/bin/bash;then echo your login shell is the bash(bourne again shell)else echo your login shell is not bash but$SHELLfi变量$SHELL包含了登录 shell的名称,我们和/bin/bash进行了比较。快捷操作符熟悉C 语言的朋友可能会很喜欢下面的表达式:-f/et
18、c/shadow&echo This computer uses shadow passwors这里&就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。您也可以认为是逻辑运算中的与操作。上例中表示如果/etc/shadow 文件存在则打印”This computeruses shadow passwors”。同样或操作(|)在 shell编程中也是可用的。这里有个例子:#!/bin/shmailfolder=/var/spool/mail/james-r$mailfolder echo Can not read$mailfolder;exit 1;echo$mailfolder has
19、 mail from:grep From$mailfolder该脚本首先判断mailfolder 是否可读。如果可读则打印该文件中的From 一行。如果不可读则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个命令:-打印错误信息-退出程序 我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用。一般函数将在下文提及。不用与和或操作符,我们也可用if 表达式作任何事情,但是使用与或操作符会更便利很多。case表达式可以用来匹配一个给定的字符串,而不是数字。case.in.)do something here;esac让我们看一个例子。file命令可以辨别出一个给定
20、文件的文件类型,比如:file lf.gz这将返回:lf.gz:gzip compressed data,deflated,original filename,last modified:Mon Aug 27 23:09:18 2001,os:Unix我们利用这一点写了一个叫做smartzip的脚本,该脚本可以自动解压bzip2,gzip 和zip类型的压缩文件:#!/bin/shftype=file$1case$ftype in$1:Zip archive*)unzip$1;$1:gzip compressed*)gunzip$1;$1:bzip2 compressed*)bunzip2$1
21、;*)error File$1 can not be uncompressed with smartzip;esac您可能注意到我们在这里使用了一个特殊的变量$1。该变量包含了传递给该程序的第一个参数值。也就是说,当我们运行:smartzip articles.zip$1 就是字符串 articles.zip select 表达式是一种bash 的扩展应用,尤其擅长于交互式使用。用户可以从一组不同的值中进行选择。select var in.;do breakdone.now$var can be used.下面是一个例子:#!/bin/shecho What is your favourite
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- shell编程 2 shell 编程

限制150内