您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > shell基础编程实例讲解
一些shell编程的例子Example2-1清除:清除/var/log下的log文件################################StartScript########################################Cleanup#当然要使用root身份来运行这个脚本cd/var/logcat/dev/nullmessagescat/dev/nullwtmpechoLogscleanedup.################################EndScript#########################################Example2-2清除:一个改良的清除脚本################################StartScript########################################!/bin/bash#一个Bash脚本的正确的开头部分.#Cleanup,版本2#当然要使用root身份来运行.#在此处插入代码,来打印错误消息,并且在不是root身份的时候退出.LOG_DIR=/var/log#如果使用变量,当然比把代码写死的好.cd$LOG_DIRcat/dev/nullmessagescat/dev/nullwtmpechoLogscleanedup.exit#这个命令是一种正确并且合适的退出脚本的方法.################################EndScript#########################################Example2-3.cleanup:一个增强的和广义的删除logfile的脚本################################StartScript########################################!/bin/bash#清除,版本3#Warning:#-------#这个脚本有好多特征,这些特征是在后边章节进行解释的,大概是进行到本书的一半的#时候,#你就会觉得它没有什么神秘的了.#LOG_DIR=/var/logROOT_UID=0#$UID为0的时候,用户才具有根用户的权限LINES=50#默认的保存行数E_XCD=66#不能修改目录?E_NOTROOT=67#非根用户将以error退出#当然要使用根用户来运行if[$UID-ne$ROOT_UID]thenechoMustberoottorunthisscript.exit$E_NOTROOTfiif[-n$1]#测试是否有命令行参数(非空).thenlines=$1elselines=$LINES#默认,如果不在命令行中指定fi#StephaneChazelas建议使用下边#+的更好方法来检测命令行参数.#+但对于这章来说还是有点超前.##E_WRONGARGS=65#非数值参数(错误的参数格式)##case$1in#)lines=50;;#*[!0-9]*)echoUsage:`basename$0`file-to-cleanup;exit$E_WRONGARGS;;#*)lines=$1;;#esac##*直到Loops的章节才会对上边的内容进行详细的描述.cd$LOG_DIRif[`pwd`!=$LOG_DIR]#或者if[$PWD!=$LOG_DIR]#不在/var/log中?thenechoCan'tchangeto$LOG_DIR.exit$E_XCDfi#在处理logfile之前,再确认一遍当前目录是否正确.#更有效率的做法是##cd/var/log||{#echoCannotchangetonecessarydirectory.&2#exit$E_XCD;#}tail-$linesmessagesmesg.temp#保存logfile消息的最后部分.mvmesg.tempmessages#变为新的log目录.#cat/dev/nullmessages#*不再需要了,使用上边的方法更安全.cat/dev/nullwtmp#':wtmp'和'wtmp'具有相同的作用echoLogscleanedup.exit0#退出之前返回0,返回0表示成功.#################################EndScript#########################################因为你可能希望将系统log全部消灭,这个版本留下了log消息最后的部分.你将不断地找到新的方法来完善这个脚本,并提高效率.要注意,在每个脚本的开头都使用#!,这意味着告诉你的系统这个文件的执行需要指定一个解释器.#!实际上是一个2字节[1]的魔法数字,这是指定一个文件类型的特殊标记,换句话说,在这种情况下,指的就是一个可执行的脚本(键入manmagic来获得关于这个迷人话题的更多详细信息).在#!之后接着是一个路径名.这个路径名指定了一个解释脚本中命令的程序,这个程序可以是shell,程序语言或者是任意一个通用程序.这个指定的程序从头开始解释并且执行脚本中的命令(从#!行下边的一行开始),忽略注释.[2]如:#!/bin/sh#!/bin/bash#!/usr/bin/perl#!/usr/bin/tcl#!/bin/sed-f#!/usr/awk-f上边每一个脚本头的行都指定了一个不同的命令解释器,如果是/bin/sh,那么就是默认shell(在Linux系统中默认是Bash).[3]使用#!/bin/sh,在大多数商业发行的UNIX上,默认是Bourneshell,这将让你的脚本可以正常的运行在非Linux机器上,虽然这将会牺牲Bash一些独特的特征.脚本将与POSIX[4]的sh标准相一致.注意:#!后边给出的路径名必须是正确的,否则将会出现一个错误消息,通常是Commandnotfound,这将是你运行这个脚本时所得到的唯一结果.当然#!也可以被忽略,不过这样你的脚本文件就只能是一些命令的集合,不能够使用shell内建的指令了,如果不能使用变量的话,当然这也就失去了脚本编程的意义了.注意:这个例子鼓励你使用模块化的方式来编写脚本,平时也要注意收集一些零碎的代码,这些零碎的代码可能用在你将来编写的脚本中.这样你就可以通过这些代码片段来构造一个较大的工程用例.以下边脚本作为序,来测试脚本被调用的参数是否正确.################################StartScript#######################################E_WRONG_ARGS=65script_parameters=-a-h-m-z#-a=all,-h=help,等等.if[$#-ne$Number_of_expected_args]thenechoUsage:`basename$0`$script_parameters#`basename$0`是这个脚本的文件名exit$E_WRONG_ARGSfi################################EndScript#########################################Example3-1.代码块和I/O重定向################################StartScript########################################!/bin/bash#从/etc/fstab中读行File=/etc/fstab{readline1readline2}$FileechoFirstlinein$Fileis:echo$line1echoechoSecondlinein$Fileis:echo$line2exit0#现在,你怎么分析每行的分割域#暗示:使用awk.################################EndScript#########################################Example3-2.将一个代码块的结果保存到文件################################StartScript########################################!/bin/bash#rpm-check.sh#这个脚本的目的是为了描述,列表,和确定是否可以安装一个rpm包.#在一个文件中保存输出.##这个脚本使用一个代码块来展示SUCCESS=0E_NOARGS=65if[-z$1]thenechoUsage:`basename$0`rpm-fileexit$E_NOARGSfi{echoechoArchiveDescription:rpm-qpi$1#查询说明echoechoArchiveListing:rpm-qpl$1#查询列表echorpm-i--test$1#查询rpm包是否可以被安装if[$?-eq$SUCCESS]thenecho$1canbeinstalled.elseecho$1cannotbeinstalled.fiecho}$1.test#把代码块中的所有输出都重定向到文件中echoResultsofrpmtestinfile$1.test#查看rpm的man页来查看rpm的选项exit0################################EndScript#########################################注意:与()中的命令不同的是,{}中的代码块将不能正常地开启一个新shell.[2]{}\;路径名.一般都在find命令中使用.这不是一个shell内建命令.注意:;用来结束find命令序列的-exec选项.[]test.test的表达式将在[]中.值得注意的是[是shell内建test命令的一部分,并不是/usr/bin/test中的扩展命令的一个连接.[[]]test.test表达式放在[[]]中.(shell关键字)具体查看[[]]结构的讨论.[]数组元素Array[1]=slot_1echo${Array[1]}[]字符范围在正则表达式中使用,作为字符匹配的一个范围(())数学计算的扩展在(())结构中可以使用一些数字计算.具体参阅((...))结构.&&重定向.scriptnamefilename重定向脚本的输出到文件中.覆盖文件原有内容.command&filename重定向stdout和stderr到文件中command&2重定向command的stdout到stderrscriptnamefilename重定向脚本的输出到文件中.添加到文件尾端,如果没有文件,则创建这个文件.进程替换,具体见进程替换部分,跟命令替换极其类似.(command)(command)和可用来做字符串比较和可用在数学计算比较重定向,用在heredocument重定向,用在herestring,ASCII比较1veg1=carrots2veg2=tomatoes34if[[$veg1$veg2]]5then6echoAlthough$veg1precede$veg2inthedictionary,7echothisimpliesnothingaboutmyculinarypreferences.8else9echoWhatkindofdictionaryareyouusing,anyhow?10fi\,\正则表达式中的单词边界.如:bash$grep'\the\'textfile|管道.分析前边命令的输出,并将输出作为后边命令的输入.这是一种产生命令链的好方法.1echols-l|sh2#传递echols-l的输出到shell中,3#+与一个简单的ls-l结果相
本文标题:shell基础编程实例讲解
链接地址:https://www.777doc.com/doc-6034343 .html