关于Shell编程的一些讨论.doc_第1页
关于Shell编程的一些讨论.doc_第2页
关于Shell编程的一些讨论.doc_第3页
关于Shell编程的一些讨论.doc_第4页
关于Shell编程的一些讨论.doc_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

51testing上的Linux:/batch.search.php=关于变量操作Q1:不能进行变量赋值,不能得到自己想要的赋值结果,怎样把命令的结果赋给一个变量?A: 可能你写错了shell语句,用了不适当的引号,请参考13问中引号与 $()的讨论/forum/viewtopic.php?t=503842/forum/viewtopic.php?p=1617953 这里要重点提醒大家区分三个字符 如果大家的回帖中的结果和你的不一致,请仔细检查你输入这三个字符是不是和回帖一致= _=GNU/linux=GNU bash 2.05b, grep 2.5, Awk 3.1.3, sed 4.0.8=关于文本处理ed vi sed awk都是常用的文本处理工具,如果你还不了解它们是什么,最好读一下下面两篇关于sed与awk的教程,这两篇是最基础的,但非常经典(请使用big5编码阅读,关于乱码的问题已经超出了讨论时限,那应该是十年前讨论的问题).tw/aspac/reports/94/94011/.tw/aspac/reports/96/96005/grep也是常用的文本处理工具,它用来查找文本中你想要或不想要的东西,它的基本用法在/viewthread.php?tid=446683文本处理中还有一门基本功是正则表达式,基础教程是.tw/aspac/reports/94/94019/这篇教程请用big5码浏览论坛中还有不错的讨论/forum/v . hlight=%D5%FD%D4%F2Q1:我使用了sed/awk,但文件没有改变A:是的,这是正常的,sed/awk的结果缺省情况下是送到标准输出的,而不是改变原文件,你可以将结果重定向到一个临时文件,然后用mv覆盖原文件,关于重定向请参考/viewthr . p;page=7#pid1636825/viewthr . 5%26filter%3Ddigest对于GNU sed 3以上版本的用户,可以用-i参数直接修改原文件Q2:如何合并/对比两个文件,如何根据file1中的条件处理其它文件?A:paste/comm/diff是解决这种问题的好工具/viewthr . 1%26filter%3Ddigest/viewthr . 1%26filter%3Ddigest这里还有一个处理这种问题强大工具:awk,可以用一句话形容:只有想不到的,没有办不到的/viewthr . 1%26filter%3DdigestQ3:为什么我使用回帖中的awk命令报错?A:有两个可能最大:1.不够细心,仔细再对比一下与回帖有没有出入2.因为你没使用Great GNU awk,如果没有gawk可用,可以尝试一下有没有nawkQ4:如何在sed/awk中使用shell中的变量?反之呢?A:1.关于awk使用shell变量的总结/viewthr . &extra=page%3D12.利用shell作变量替换(具体原理看13问之qouting)var=abcdsed:sed -n /$var/p / awk: awk /$var/num=2sed: sed -n $np /awk: awk NR=$var#sed要用双引号,awk变量顺序单双$var双单复制代码反之:sed/awk将变量传给shell可以用eval, 如 eval $(awk BEGINprint a=ggg b=3)然后echo $a;echo $b测试一下复制代码=_=GNU/linux=GNU bash 2.05b, grep 2.5, Awk 3.1.3, sed 4.0.8=关于自动执行交互任务Q1:如果实现ftp,telnet?A: 用管道或here文档可以解决/viewthread.php?tid=158808/viewthread.php?tid=3139Q2:为什么用管道或here文档的方法不能实现自动ssh,su与更改密码?A:这些程序需要从tty获得输入而不是标准输入,通用的解决办法是expect,下面是这个工具的教程/forum/v . mp;highlight=expect/forum/v . mp;highlight=expect对于ssh,有另一种用用密钥对验证的方法/viewthr . 1%26filter%3Ddigest对于GNU/linux用户,passwd使用-stdin选项可以接受标准输入,具体请man passwd= _=GNU/linux=GNU bash 2.05b, grep 2.5, Awk 3.1.3, sed 4.0.8QUOTE:=关于时间处理Q1:如何取得某天前的时间?A:如何用date获得前一天的日期,忘了如何显示昨天的日期?一个关于时间转换的awk脚本shell 计算明天和昨天日期的函数如何计算一个日期是星期几? 如何显示昨天的日期?俺写了几个关于日期的小函数=另外几个计算日期的函数,非GNU Shell可以看下(感谢Shell_HAT 提供)/thread-1772999-1-1.html _=GNU/linux=GNU bash 2.05b, grep 2.5, Awk 3.1.3, sed 4.0.8=关于条件判断Q1:为什么我的条件判断会出错?A:是因为没遵循shell的语法/viewthr . 6%26filter%3Ddigest/viewthread.php?tid=503842= _=GNU/linux=GNU bash 2.05b, grep 2.5, Awk 3.1.3, sed 4.0.8=关于crontabQ1:为何可以手工执行,加入crontab后却不能正确执行A:1.如果crontab执行失败,会发送email给你,请在mail中查找出错原因2.crontab中的PATH变量设置与交互式shell环境中不同,要执行的命令必须有正确路径3.在crontab中%字符被认为是换行,所以你的命令中有%时,在crontab中要加转义比如30 * * * * date +%D datefile 是错误的正确的应该是30 * * * * date +%D datefile复制代码= _=GNU/linux=GNU bash 2.05b, grep 2.5, Awk 3.1.3, sed 4.0.8 关于while read只执行一次的问题Q:下面的代码为何只执行了一次就退出了?seq 10 filewhile read adoecho $add &/dev/nulldone newtext.file51Testing软件测试网i8BUT:i#x b4kawk: awk 用来从文本文件中提取字段。缺省地,字段分割符是空格,可以使用-F指定其他分割符。CG IR4UeL325010cat file.txt | awk -F, print 1 , 3 这里我们使用,作为字段分割符,同时打印第一个和第三个字段。如果该文件内容如下: Adam Bor, 34, IndiaKerry Miller, 22, USA51Testing软件测试网gI(R.ZSP 2 命令输出结果为:Adam Bor, IndiaKerry Miller, USAeE&z z4T1f325010 2) 概念: 管道, 重定向和 backtickv?N!g5E#_x325010这些不是系统命令,但是他们真的很重要。?6wU;hz325010管道 (|) 将一个命令的输出作为另外一个命令的输入。nm?*HGF KaC325010 grep hello file.txt | wc -l51Testing软件测试网:O(G)v_DHD在file.txt中搜索包含有”hello”的行并计算其行数。51Testing软件测试网*JRi C!M6w|N|在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。51Testing软件测试网8qC):gM8x重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。51Testing软件测试网7h g w 写入文件并覆盖旧文件51Testing软件测试网 S+ YgQ1v 加到文件的尾部,保留旧文件内容。51Testing软件测试网8Bh/A2f6k 反短斜线3_4urr325010 使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。$s Uv$W U#G325010 命令:U/H*? yN5w)Y&325010 find . -mtime -1 -type f -printpqQE;Y325010 用来查找过去24小时(-mtime 2则表示过去48小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可以使用以下脚本:51Testing软件测试网N-GU,Z1vl #!/bin/shn7W8(Bk6325010 # The ticks are backticks () not normal quotes ():/%-jW+zwP#|_325010 tar -zcvf lastmod.tar.gz find . -mtime -1 -type f -print*Zaw O|r325010 3) 流程控制Q6_V;gn8M3E325010 1.if51Testing软件测试网(k)k BS/0NV| if 表达式 如果条件为真则执行then后面的部分:YT i(o c7G_325010 if .; thend_3M*jFX5h2q|?325010 .-m(l.WN7CD G q;v8I325010 elif .; then51Testing软件测试网 ?8G7BE.CV1I .51Testing软件测试网!WXQ2nlaN: else+Xwt1k wX325010 .Z!h7XmMX$a325010 fi+B.m F#1LvT2xk325010 大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等51Testing软件测试网H u%y m3I8z(r 通常用 来表示条件测试。注意这里的空格很重要。要确保方括号的空格。51Testing软件测试网2q$?y#(? -f somefile :判断是否是一个文件51Testing软件测试网Rc6IB&Hm)u? -x /bin/ls :判断/bin/ls是否存在并有可执行权限51Testing软件测试网$tM5SrW4J -n var :判断var变量是否有值y C2?sj4r %zY325010 a = b :判断a和b是否相等51Testing软件测试网vOs7?g#Hfi 执行man test可以查看所有测试表达式可以比较和判断的类型。51Testing软件测试网/Vx$a$dsaM(IH 直接执行以下脚本:.zZ N%X9WvV)oS325010 #!/bin/shZf|U/i+h325010 if SHELL = /bin/bash ; then51Testing软件测试网z6A0N NSUS9P!o echo your login shell is the bash (bourne again shell)51Testing软件测试网Gc|)UD|J else51Testing软件测试网AU8$b(A+Ig echo your login shell is not bash but SHELL51Testing软件测试网z?WZ8(lz g fi51Testing软件测试网3Rqp!pV 变量SHELL包含了登录shell的名称,我们和/bin/bash进行了比较。51Testing软件测试网&ePCD jy/b2muWB-x&y6v2A j325010 快捷操作符3drwf-l6B325010 熟悉C语言的朋友可能会很喜欢下面的表达式:51Testing软件测试网;qt:w+D*N0l&F- -f /etc/shadow & echo This computer uses shadow passworsE n|o#325010这里 & 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句。您也可以认为是逻辑运算中的与操作。上例中表示如果/etc/shadow文件存在则打印” This computer uses shadow passwors”。同样或操作(|)在shell编程中也是可用的。这里有个例子:51Testing软件测试网EQxo5JzF|& I #!/bin/sh51Testing软件测试网:GI 9L9c(T9c mailfolder=/var/spool/mail/james51Testing软件测试网2dg;wl d -r mailfolder echo Can not read mailfolder ; exit 1; 51Testing软件测试网dBr:oI echo mailfolder has mail from:Q.DuyQ_6g(v$Z325010 grep From mailfolder51Testing软件测试网r4?2aa F-Q8Tf 该脚本首先判断mailfolder是否可读。如果可读则打印该文件中的From 一行。如果不可读则或操作生效,打印错误信息后脚本退出。这里有个问题,那就是我们必须有两个命令:51Testing软件测试网oB)?7k8C A e-打印错误信息51Testing软件测试网3u$qV)|ML-退出程序:g u ? y3w&Jl;gc#Z325010我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用。一般函数将在下文提及。2EB!eh*yfaK325010不用与和或操作符,我们也可以用if表达式作任何事情,但是使用与或操作符会更便利很多。4FG rhl,T#C325010 *awZB*H!tGK*q325010 2.case51Testing软件测试网v!X o2h&P case :表达式可以用来匹配一个给定的字符串,而不是数字。mvK!Cp*z.p/s325010 case . in51Testing软件测试网#l5z8h7%m .) do something here ;51Testing软件测试网&k$nY#UU Ok esac51Testing软件测试网glC%C:JPk 让我们看一个例子。 file命令可以辨别出一个给定文件的文件类型,比如:51Testing软件测试网+1T.Anj+W file lf.gz51Testing软件测试网llfeA 这将返回:51Testing软件测试网+CL(j|js+:O0:R,H lf.gz: gzip compressed data, deflated, original filename,(gA-u!nZ325010 last modified: Mon Aug 27 23:09:18 2001, os: Unix51Testing软件测试网%KW4Ol z |%_ 我们利用这一点写了一个叫做smartzip的脚本,该脚本可以自动解压bzip2, gzip 和zip 类型的压缩文件:51Testing软件测试网:G+$mU #!/bin/sh51Testing软件测试网 gI7v6h.MmvR ftype=file 151Testing软件测试网+h y%s-Z/u case ftype in51Testing软件测试网n|%a-d z;l 1: Zip archive*)51Testing软件测试网Y$YsF FTY unzip 1 ;&fHL#A R7325010 1: gzip compressed*)3uR3oT/b:,d DX$vQ325010 gunzip 1 ;T ToO325010 1: bzip2 compressed*)51Testing软件测试网A w j t.gny bunzip2 1 ;,HshJz8325010 *) echo File 1 can not be uncompressed with smartzip;Qj6?.6Xv8F325010 esac51Testing软件测试网#g5S4uU7a 您可能注意到我们在这里使用了一个特殊的变量1。该变量包含了传递给该程序的第一个参数值。4KmGs3t B325010也就是说,当我们运行:h K.H#e 9L325010 smartzip articles.zip51Testing软件测试网,w(dY(xTMl;c-F3Z 1 就是字符串 articles.zip51Testing软件测试网0G2BjLc 3. selsect51Testing软件测试网 Iv O.w,AW;e C select 表达式是一种bash的扩展应用,尤其擅长于交互式使用。用户可以从一组不同的值中进行选择。UiCI325010 select var in . ; do51Testing软件测试网4M ?6&H9L v-P break51Testing软件测试网6!t x-|O:UK/Nh!t done51Testing软件测试网!H1O&k%j2X_P . now var can be used .51Testing软件测试网p*_9kN3F)k$I:G 下面是一个例子:C vXw.fA!)X325010 #!/bin/shT1|tb(j|#K$CT9u325010 echo What is your favourite OS?51Testing软件测试网 N/A a3D select var in Linux Gnu Hurd Free BSD Other; doEl#ojjV,F(JC325010 break51Testing软件测试网#L;_5SEb&g done51Testing软件测试网-U9; xqD+l echo You have selected var51Testing软件测试网e o)EP2 _ 下面是该脚本运行的结果:51Testing软件测试网JUep9G o|6g ?c What is your favourite OS?51Testing软件测试网zb9Y;kP7e 1) Linux51Testing软件测试网9S)s*g,c Nw 2) Gnu HurdE#h:Xhq7Z6jT325010 3) Free BSD,YeMxV7G+E0PP325010 4) OthergE(LkkyW 325010 #? 19up3B*lEDy5D9g325010 You have selected Linux51Testing软件测试网:bO)F8A7D1ek$nX6 注:var是个变量,可以换成其它的值。break用来跳出循环,如果没有break则一直循环下去。done与select对应。i(d3IEN/hG5E325010 4.loop51Testing软件测试网 o:j8f:Iejky X loop表达式:51Testing软件测试网xO%F(F while .; do51Testing软件测试网1otk+%E:C .51Testing软件测试网 A R9|&w&I5x7;HfA done51Testing软件测试网!BV&f3OV j while-loop 将运行直到表达式测试为真。will run while the expression that we test for is true.Y.p)U S&x7k325010关键字break 用来跳出循环。而关键字”continue”用来不执行余下的部分而直接跳到下一个循环。51Testing软件测试网_ju.VfK!H:D:51Testing软件测试网IU e,o3f h-rE for-loop表达式查看一个字符串列表 (字符串用空格分隔) 然后将其赋给一个变量:q&yU+vxb8s325010 1, for var in .; do51Testing软件测试网 E(UsmHS .B(r;Ira325010 donec;O M)Z,z325010 在下面的例子中,将分别打印ABC到屏幕上:51Testing软件测试网2(p.x,V_%?D #!/bin/sh51Testing软件测试网Z(,ti cU for var in A B C ; do b2t!D&_6P325010 echo var is varZE,N0n8A R0TH5QJ%j:c325010 done51Testing软件测试网,t:F-S X3c x51Testing软件测试网%jdk7pZ4D&xZ 2, for ( 条件一; 条件二; 条件三 );dommFw.l1_325010 .51Testing软件测试网7cKy7m:X!m done51Testing软件测试网$M5Gl $_%)K 例:51Testing软件测试网z)w4v,|3U51Testing软件测试网5U;Slwu for (i=1;i10;i=i+1);do3o1P5l!YBK325010 g3GbO(h2E9j:l325010 echo a51Testing软件测试网6UTD8geq+ done1n1uGy1U U9s.T325010输出:51Testing软件测试网v 6H S$O8s%|Skaf51Testing软件测试网# D*? a51Testing软件测试网_a%M8V*;b-uYF&ha51Testing软件测试网Wz8pl(t a2D!z*yX0y!1B/H325010a)gwM%-IC f&_*Z/U325010a/U5R5z*rI$O Bu4V325010ag;L4sTTn*LDp+t325010a51Testing软件测试网wJ?e0Na|ikm|d8JRF*C325010a51Testing软件测试网Q#W_t%lcU#O_+Y/_ n+f325010条件一:这可以看成是初始值,如上面的例子中,初始值是 i=1 啦!9Hz7I mQH+E_O/RiT325010条件二:这可以看成是符合值,如上面的例子中,当 i=100 的时候都是符合条件的!51Testing软件测试网H-?z4mrC条件三:这可以看成是步阶!也就是说, i 每次都加一! 所以啦!上面的例子是说:由 i=1 开始到 i100 (也就是 i=101 )就跳出这一段程序段!怎样!不难吧!uK$r9E5mF32501051Testing软件测试网lOl7kKM*S j b-G$b UM)q eE4j325010 &y#s9Wm+G8zBq232501051Testing软件测试网#Y D,caLavB:J.7O 下面是一个更为有用的脚本showrpm,其功能是打印一些RPM包的统计信息:51Testing软件测试网dhx$V?_:q-KM #!/bin/sh51Testing软件测试网2t c #OhJ # list a content summary of a number of RPM packages51Testing软件测试网i)g%kuswE+G$P # USAGE: showrpm rpmf

温馨提示

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

评论

0/150

提交评论