shell中字符串处理方式

上传人:飞*** 文档编号:48311050 上传时间:2022-01-03 格式:DOCX 页数:16 大小:20.99KB
收藏 版权申诉 举报 下载
shell中字符串处理方式_第1页
第1页 / 共16页
shell中字符串处理方式_第2页
第2页 / 共16页
shell中字符串处理方式_第3页
第3页 / 共16页
资源描述:

《shell中字符串处理方式》由会员分享,可在线阅读,更多相关《shell中字符串处理方式(16页珍藏版)》请在装配图网上搜索。

1、shellxx字符串处理方式象专业人员那样截断字符串尽管 basename 和 dirname 是很好的工具,但有时可能需要执行更高级的 字符串 “截断 ” ,而不只是标准的路径名操作。当需要更强的说服力时,可以利用 bash 内置的变量扩展功能。已经使用了类似于$MYVAR勺标准类型的变量扩展。但是 bash自身也可 以执行一些便利的字符串截断。看一下这些例子:第一种方法:$varible#*string从左向右截取最后一个string后的字符串$varible#*string从左向右截取第一个string后的字符串$varible%string*从右向左截取最后一个string后的字符串$

2、varible%string* 从右向左截取第一个string 后的字符串* 只是一个通配符可以不要$ MYVAR=foodforthought.jpg$ echo $MYVAR#*forthought.jpg$ echo $MYVAR#*foodforthought.jpg在第一个例子中,输入了 $MYVAR#*fo。它的确切含义是什么?基本上, 在$ 中输入环境变量名称,两个#,然后是通配符(*fo) 。然后, bash 取得MYVAR,找到从字符串foodforthought.jpg开始处开始、且匹配通配符*fo的最 长子字符串,然后将其从字符串的开始处截去。刚开始理解时会有些困难,为了

3、感受一下这个特殊的 #选项如何工作,让我们一步步地看看bash 如何完成这个扩展。首先,它从foodforthought.jpg 的开始处搜索与*fo 通配符匹配的子字符串。以下是检查到的子字符串:fo MATCHES *fofoofoodfoodffoodfo MATCHES *fofoodforfoodfortfoodforthfoodforthofoodforthoufoodforthougfoodforthoughtfoodforthought.jfoodforthought.jpfoodforthought.jpg在搜索了匹配的字符串之后,可以看到 bash 找到两个匹配。它选择最长

4、的匹配,从初始字符串的开始处除去,然后返回结果。上面所示的第二个变量扩展形式看起来与第一个相同,但是它只使用一个# - 并且 bash 执行几乎同样的过程。它查看与第一个例子相同的子字符串系列,但是bash 从初始字符串除去最短的匹配,然后返回结果。所以,一查到fo子字符串,它就从字符串中除去fo,然后返回odforthought.jpg。这样说可能会令人十分困惑,下面以一简单方式记住这个功能。当搜索最长匹配时,使用#(因为#比#长)。当搜索最短匹配时,使用#。看,不难记吧!等一下,怎样记住应该使用#字符来从字符串开始部分除去?很简单!注意到了吗:在美国键盘上,shift-4是$,它是bash

5、变量扩展字符。在键盘上,紧靠$左边的是 # 。这样,可以看到:#位于 $的 “开始处 ”,因此(根据我们的记忆法),#从字符串的开始处除去字符。您可能要问:如何从字符串末尾除去字符。如果猜到我们使用美国键盘上紧靠 $ 右边的字符 (%),那就猜对了。这里有一些简单的例子,解释如何截去字符串的末尾部分:$ MYFOO=chickensoup.tar.gz$ echo $MYFOO%.*chickensoup$ echo $MYFOO%.*chickensoup.tar正如您所见,除了将匹配通配符从字符串末尾除去之外,%和%变量扩展选项与#和#的工作方式相同。请注意:如果要从末尾除去特定子字符串,

6、不必使用 * 字符:MYFOOD=chickensoup$ echo $MYFOOD%soupchicken在此例中,使用%或%并不重要,因为只能有一个匹配。还要记住:如果忘记了应该使用 #还是 % ,则看一下键盘上的3 、 4 和 5 键,然后猜出来。第二种方法:$varible:n1:n2:截取变量 varible 从 n1 到 n2 之间的字符串。可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在bash 中输入以下行:$ EXCLAIM=cowabunga$ echo $EXCLAIM:0:3cow$ echo $EXCLAIM:3:7abunga这种形式

7、的字符串截断非常简便,只需用冒号分开来指定起始字符和子字符串长度。应用字符串截断现在我们已经学习了所有截断字符串的知识,下面写一个简单短小的脚本。我们的脚本将接受一个文件作为自变量,然后打印:该文件是否是一个tar 文件。要确定它是否是tar 文件,将在文件末尾查找模式 .tar 。如下所示:mytar.sh -一个简单的脚本#!/bin/bashif $1#*. = tar thenecho This appears to be a tarball.elseecho At first glance, this does not appear to be a tarball.fi要运行此脚本,

8、将它输入到文件 mytar.sh 中,然后输入 chmod 755 mytar.sh ,生成可执行文件。然后,如下做一下 tar 文件试验:$ ./mytar.sh thisfile.tarThis appears to be a tarball.$ ./mytar.sh thatfile.gzAt first glance, this does not appear to be a tarball.好,成功运行,但是不太实用。在使它更实用之前,先看一下上面使用的if语句。语句中使用了一个布尔表达式。在 bash中,=比较运算符检查字符串是否相等。在bash 中,所有布尔表达式都用方括号括起。

9、但是布尔表达式实际上测试什么?让我们看一下左边。根据前面所学的字符串截断知识,$1#*.将从环境变量1包含的字符串开始部分除去最长的*. 匹配,并返回结果。这将返回文件中最后一个.之后的所有部分。显然,如果文件以.tar结 束,结果将是tar ,条件也为真。您可能会想:开始处的 1环境变量是什么。很简单-$1 是传给脚本的第一个命令行自变量, $2 是第二个,以此类推。1、我用在判断apache 安装版本的时候用的isherisher-ubuntu:$ aa=apache_2.0.59isherisher-ubuntu:$echo $aa|awk -F_print $1;#F 后面的下戈 U

10、线分1RJ 成了 apache 和2.0.59两个变量 $1 即第一个2、写进度条时候参考过,后来考虑到成本大于使用,就放弃了isherisher-ubuntu:$ a=isherisher-ubuntu:$ echo $a|cut -b 2-5isherisher-ubuntu:$ 2345 #这里是输出结果cut:对标准输入的字符串进行处理cut -bn-m:byte 为单位,从第 n 个 byte 开始,取 m 个cut -bn,m:byte 为单位,截取第 n,m 个 bytecut -b-n,m:以byte为单位,截取1-n,和第m个-c:charactor 为单位-d:指定分隔符,

11、默认为 tab-s:使标准输入中没有delimetercut -f1:截取第1个域3、字符串截取前后部分内容echo $变量 #开始字符串*结束字符串 #表示掐头,因为键盘上#在 $($就是变量,这样便于记住)前面 ,一个表示最小匹配echo $变量开始字符串r*结束字符串# %表示去尾,因为键盘上在$后面, 一个表示最小匹配echo $变量 #开始字符串*结束字符串两个表示最大匹配echo $变量%开始字符串r*结束字符串两个表示最大匹配总结记忆方法键盘上#$%三个字符连续的,以$为变量提示符,#即截取变量前的字符,表示截取后面字符例子isherisher-ubuntu:$ aa=No su

12、ch file or directory #编写此文档时,正好shell 开着,提示这行话*_Aisherisher-ubuntu:$ echo $aa#No*directory #这里就是输出结果,将No such file or directory 之间的都删除了,得到就是 ectory 截取后部的意思相同isher 在简单说一下#的意思isherisher-ubuntu:$ aa=No such file or directory #截取e 之后的内容,此句话中有两个果标记一个#isherisher-ubuntu:$ echo $aa#No*e则结果为 or directoryisher

13、isher-ubuntu:$ echo $aa#No*e#的结果为ctory截取后部的意思相同4、在写脚本的时候,有一个替换的问题,特提出echo $变量 / 旧的内容/新的内容 #替换一个echo $变量 / 旧的内容/新的内容 #替换所有例子:isherisher-ubuntu:$ aa=No such file or directoryisherisher-ubuntu:$ echo $aa/o/aNa such file or directory #这里仅替换了第一个单词No 的 o 变为了 aisherisher-ubuntu:$ aa=No such file or directo

14、ryisherisher-ubuntu:$ echo $aa/o/aNa such file ar directary #这里可以看到,替换这句话(变量 )的所有的 o 为了 aT1 . 得到字符串xx方法一 :$echo $#variable代码 :$ x=this is a test$ echo $#x14方法二 :$expr length $variable代码 :$ x=this is a test$ expr length $x14方法三 :$expr $variable :.*code:代码 :$ x=this is a test$ expr $x :.*142 .查找字符串子串位

15、置方法 :$expr index $variable substringcode:代码 :$ x=this is a test$ expr index $x is3$ expr index $x t1(ps:如果出现重复,好象只能查到第一个,第二个,第三个,.,怎么查到呢?)3 .得到字符串子字符串方法一 :$echo $variable:R 码:$ x=this is a test$ echo $x:1:5his i方法二 :$expr substr $variable startposition length10 / 17代码 :$ x=this is a test$ expr subst

16、r $x 1 5this(ps:注意方法一和方法二中位置的区别 !)4 .匹配正则表达式之匹配xx方法 :$expr match $x string代码 :$ x=this is a test$ expr match $x his0$ expr match $x this4$ expr match $x .15 .字符串的掐头去尾方法 :$echo $variable#startletter*endletter # # 表示掐头,因为键盘上#在$前面 ,一个表示最小匹配$echo $variable#tartletter*endletter 两个表示最大匹配$echo$variable%sta

17、rtletter*endletter#% 表示去尾,因为键盘上%在$后面 ,一个表示最小匹配$echo $variable%startletter*endletter 两个表示最大匹配代码 :$ x=this is a test$ echo $x#this is a test$ echo $x#t*his is a test$ echo $x#t*sis a test$ echo $x#t*st$ echo $x%tthis is a tes$ echo $x%s*tthis is a te$ echo $x%e*tthis is a t$ echo $x%i*tth6 .字符 (串)的替换方

18、法 :$echo $variable/oldletter/newletter # 替换一个$echo $variable/oldletter/newletter # 替换所有代码 :$ x=this is a test$ echo $x/i/mthms is a test$ echo $x/i/m从 dbaccess向 shell 传值2008-12-04 22:16shell 文件内容:#!/bin/shVALUE=dbaccess gddb /dev/nullselect corpid from cacorpfund where corpid=P-0#0;close database;!#

19、echo value:$VALUEha=echo $VALUE|grep -v corpid|grep -v 八$、echo $ha结果:P-0#0select corpid from cacorpfund where corpid=P-0#0;corpidP-0#0注意:ha=echo $VALUE|grep -v corpid|grep -v 八$grep -v 八$:这个是去空行echo $VALUE:这里必须要加双引号lixshn请教谁能在shell脚本中把参数传进dbaccess里?如下一 shell 脚本!DATE=+%y/%m/%ddbacces;$DATE 请教怎样能把 DAT

20、E变量传 到dbaccess里,我这样好象不起作用!大梦请教谁能在shell脚本中把参数传进dbaccess里?你的DATE赋值不正确吧!大梦请教谁能在shell脚本中把参数传进dbaccess里?DATE=+%y/%m/%dmuzx请教谁能在shell脚本中把参数传进dbaccess里?quotei原帖由lixshn”发表:/i如下一 shell 脚本!DATE=+%y/%m/%ddbacces;$DATE 请教怎样能把 DATE变量传 到dbaccess里,我这样好象不起作用!/quote1 . 你在文件名中使用了/ 号2 .DATE赋值号后缺少动作color=reddate/color,

21、改一下:codeDATE=date +%y%m%d”/code大梦请教谁能在shell脚本中把参数传进dbaccess里?DATE=date+%y/%m/%d你可以先显示一下DATE的值!看有没有正确赋值!lixshn请教谁能在shell脚本中把参数传进dbaccess里?不是 date 变量的原因!我把DATE“”=都不行,好象不接受变量吧!大梦请教谁能在shell脚本中把参数传进dbaccess里?有没有报错?carrierye请教谁能在shell脚本中把参数传进dbaccess里?#!/bin/shdbaccess - -; $D1;close database;!result message:资料库已被选用 .交易开始 .已锁定表格 .已载出 2xx.资料确认 .资料库已关闭 .lixshn请教谁能在shell脚本中把参数传进dbaccess里?我好象必须是这样写!unload to a.txt select * from a wherea.date;$DATE在能成功,因为$DATE是一串字符必须用引括起来16 / 17

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!