第一篇:十年学会编程
这里分享一篇 Peter Norvig的 《十年学会程序设计》(Peter Norvig系Google研究院主任、美国计算机协会(ACM)资深会员(Fellow))。全文如下:
十年学会程序设计
Peter Norvig(Copyright 2001)原文网址
为何大家如此匆忙?
走进任何一家书店,你会看到书架上一排不见尽头的放着如 <7天自学Java语言> 以及几天或者几小时学会Windows, 因特网或者Visual Basic 这类书。我在Amazon 网上书店用一下的方式进行高级搜索:
出版年份: 1992以后 书名包括:“天” 和 “学习” 或 “自学”
得到了268条搜索结果,其中前78条都是计算机书(第79条是 30天学会孟加拉语)。我用 “小时” 代替“天” 作为关键字,得到了神奇般类似的结果:这次有253本书,前77本是计算机书,第78本是 24小时自学语法和写作风格。排名前200的书中有96%是计算机书。
由此可见,人们要不就是急着想学会计算机,要不就是计算机相比于其他事情太容易学会了。比如说把,没有书是写在几天弹奏贝多芬或几天学会量子物理,甚至也没有几天学会帮小狗打扮这样的书。
让我们分析一下 三天学会Pascal语言 [英文网页] 这样的标题表达了什么意思:
•学会:
在 三天内,你没有时间去写几个有意义的程序,或者从成功和失败中学到东西。你也没时间跟有经验的程序员一起工作,所以也无法了解在真正编程是什么样子。简短 的说,就学会而言,时间显然不够。所以这些书只是浮于表面的熟悉,而不是深刻的理解。如同Alexander Pope 所说,一知半解是危险的。
•Pascal 语言:
三 天内你可能学会Pasacl语言的语法(如果你已经掌握一个类似的编程语言),但你无法学会如何合理运用这些语法。简言之,如果你是个Basic 程序员,你可以用Pascal 语言写出类似Basic 风格的程序,但你学不到Pascal语言的优点(还有缺点)到底在哪。重点是什么呢? Alan Perlis 曾说: “如果编程语言不能影响你的编程思维,那就不值得去学.” 另一个可能是,你必须学会一点点Pascal语言(或是像VB语言、Javascript等),因为你需要跟现成的工具组合完成特定的工作。不过这个时候,你实际上学的不是怎么写程序,而是要学着如何完成工作。
•三天
不幸的是三天根本不够;下面的章节会告诉你为什么
十年学会程序设计
研究者 Hayes, Bloom 的研究表明,在几乎所有的各种领域,大约要十年才能培养出专业技能。这些领域包括下西洋棋、音乐作曲、绘画、钢琴、游泳、网球,及神经心理学和数学拓
扑学。似乎没有真正的捷径--即便是莫扎特在四岁就展露出音乐天才,在他写出世界级的音乐之前仍然用了超过十三年的时间。
再看另一种类型的领域。披头士乐团似乎是在1964年的Ed Sullivan 剧场表演突然地火起来并成为第一乐队的。但其实他们从 1957 年开始,就在利物浦、汉堡等地的小型俱乐部表演。虽然他们很早就显现强大的吸引力,但他们决定性的成功作品 Sgt Pepper 也到1967年才发行。Samuel Johnson 则认为或许还不止十年才行,他说:任何领域的卓越成就都必须用一生的努力才能取得;稍微低一点的代价都是换不到的。Chaucer 则感叹道: “生命如此短促,学习技艺却要这么地长”
以下是我在编程上成功的秘诀:
•对编程产生感兴趣并因为乐趣而写程序。确信你自始至终都能乐在其中,这样你才愿意将十年光阴投入编程事业.•与其他程序员交流;阅读别人的代码。这比任何书任何培训都重要。
•不断地编写。最好的学习方法是在实践中学习。从技术角度说,”在特定领域的个人最高效率并不因为经验够多就会自动获得;但若有意识的通过努力去提升经验,个人效率会变高”(第336页)而 “高效的学习一般需要明确的任务和因人而异的适当难度,以及及时的反馈和重复或者修正错误的机会”(20~21页)Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life(实践中认知:心智、数学与日常文化)是这个观点的一本有趣参考书籍。
•如 果你愿意,你可以去读四年大学(或再读研究生)。这可以让你满足一些工作的学历要求,同时也可让你对这个领域有更深的认识。但如你不喜欢上学,你也能(得 有牺牲)通过工作获得类似的经验。无论如何,只读书是不够的。《New Hacker’s Dictionary》的作者Eric Raymond 曾经说过: “计算机的教育无法让人成为编程的专家,正如研究画笔与颜料不能让人成为专业画家一样.” 一个在我所有招聘过的人中属于最优秀之一的程序员只有高中毕业,但他写出很多很棒 的程序,他甚至有自己的新闻组。他获得的股票期权使得他可以拥有自己的午夜酒吧.•跟其他程序员一起完成项目。在一些项目中成为最好的程序员;在一些中则充当最差的一个。当你是最佳的,你要测试自己领导项目的能力,并以你的能力鼓励他人。当你是最差的,要看看高手做些什么,他们不喜欢做什么(因为他们会叫你去帮他们做).•接手别的程序员完成项目。全心投入并理解别人的程序。当原作者不在的时候,看看在理解与修改时有什么要注意的。想想如何设计你的程序使得后来维护的人容易上手。
•至 少学会六门编程语言。一种要支持类/对象(class abstractions)的语言, 如Java或C++;一种函数式(functional abstraction)语言, 如 LISP 或 ML;一种支持语法抽象(syntactic abstraction)的语言 如 LISP;一种声明式语言, 如Prolog或 C++模版;一种支持协同式(coroutines)编程, 如 Icon 或 Scheme;还有一种支持并行(parallelism)的语言, 如 Sisal.•记住在 “计算机科学” 中包括”计算机” 这个词。要知道你的计算机执行一条指令需要多久,到内存中取一个字需要多久(缓存是否击中), 到磁盘读取连续的字需要多久,而磁盘的定位又需要多久.(解答见文末)
•进行语言标准化的工作。可以像是由ANSI C++ 委员会,或由你自己的团队,来决定你们的编码风格,譬如说缩排是2或4个空格。不管怎样,你都能学到别人到底喜欢什么,对语言的感受有多深,甚至能了解到一点他们为什么有这样的感觉。
•并具备良好的判断力,也别老纠缠在语言标准化上.谈 了上面所有的想法后,我不禁要问究竟能从书上学到多少。在第一个孩子出生前,我读完了所有的 “怎样…” 的书,仍觉得自己是个一无所知的(照顾孩子的)菜鸟。30个月后,第二个孩子出世,我要重回这些书好好复习么? 不!取而代之的是,我开始相信自己的个人经验。这些难得的经验,比专家写的几千页手册还要有用,而且让我重新找到了自信.Fred Brooks(译注: <人月神话>作者)在他的文章 没有银弹 中指出,发掘卓越软体设计者的三部曲:
1.尽早尽可能地以系统化的方式发掘最佳设计人员。
2.给有潜力者指派生涯规划师,并谨慎地规划他们的职业生涯。
3.提供机会给正在成长的程序员,让他们能相互影响,彼此激励。
这里假定了某些人已具备成为卓越设计师的必要潜能;工作只是诱导他们前进。Alan Perlis 说得更简洁了,你可以教任何人学雕塑,但对米开朗基罗而言,要教他的反倒是有哪些事不要做, 卓越的程序员也一样。
所以,尽管买那些 Java 书吧!你或许能从中找到点有用的,但是在24小时,几天或者几个月中,这些都不会改变你的人生,你也不能掌握一个真正的程序员应该具备的真正的综合的技能。
参考文献:
Bloom, Benjamin(ed.)Developing Talent in Young People, Ballantine, 1985.Brooks, Fred, No Silver Bullets, IEEE Computer, vol.20, no.4, 1987, p.10-19.Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.________________________________
解答:
各种操作的时间,以2001年夏季,典型配置的 1GHz 个人计算机为标准:
执行单一指令 1 纳秒
从L1 高速缓存取一个字 2 纳秒
从内存取一个字 10 纳秒
从磁盘取连续存放的一个字 200 纳秒
磁盘寻址并取字 8 毫秒
________________________________
附录 I: 语言的选择
好几个人问过我一开始应该先学哪个计算机编程语言,这个问题没有唯一的答案,不过选择的时候可以从以下的几个方面考虑:
•朋友在用的.当 人们问我:”我该用什么操作系统的时候”,我通常的回答是:“用你朋友用的”.这样的好处是从朋友那儿学习可以弥补复杂的操作系统差异或者编程语言差异(给你造成的困惑)。这里也要考虑你未来的朋友:如果你一直使用的话,开发社区会 是你的朋友。你选择了一个具有有巨大的增长的开发社区还是一个小的快消失的开发社区的语言? 它有相关的书,网站和论坛可以获取解答么? 你喜欢那些论坛上的人么?
•保持简单.诸如C++和Java 是为那些关心代码执行效率的有经验的大型团队的开发人员设计的。因此这些语言中有些为这些特殊场合设计的部件。你只是关心编程而不需要关心复杂情况。你需要一个为新学编程的人设计的容易学习和理解的语言。
•实践.什么是学习钢琴的好方法呢? 是一边听音一边弹奏的“交互式” 的方法呢,还是全听完整首歌然后再弹奏的那种“批处理”方式呢? 很显然, 交互学习的方式能够让学钢琴变得简单–这也适用于编程.选取一种交互式的编程语言并且坚持使用.基于以上的这些标准,我对于第一次接触编程的人推荐 Python 或 Scheme.但是情况各有不同,或许也有其他的选择.如果你不满10岁,你可能会喜欢Alice 或者Squeak(年龄大的人或许也喜欢这些).重要的是在选择后, 立即开始学习和使用.附录II: 书和其他资源:
很多人问我该从什么书或者什么网页开始看起。我重申一句:“仅仅看书是不够的”,不过我也推荐一下的一些:
•Scheme: 计算机程序的结构和释义(Abelson & Sussman)可能是计算机科学最好的导论了, 他还告诉程序员怎么理解计算机科学, 你可以访问这本书的 在线视频讲座 和 全文在线.这本书也很有挑战性,可能会排除掉一些可能在其他领域成功的人.•Scheme: 怎样设计程序(Felleisen 等)是讲解怎样设计优雅的函数式语言的最好的书之一.•Python: Python 编程,面向计算机科学的导论(Zelle)是用Python 介绍计算机科学的好书.•Python: 一些关于Python的 入门教程 可以在 Python.org 上找到.•Oz: 计算机编程的概念,技术和模型(Van Roy & Haridi)可以视为第一本书的现代版.他是关于编程的一些总揽,包含了比第一本书更加广泛也更加容易阅读和理解的领域。这本书使用了一个不太为人所知的编程语言叫 Oz, 不过这个可以作为学习其他编程语言的一个基础。
________________________________
注: T.Capey 指出,在Amazon 的 问题彻底解决者 的页面上购买了这本书的人还买了: “21天学孟加拉语” 和 “自学语法和写作风格” 这两本书,我估计大部分是我这个页面带过去的用户.Peter Norvig(Copyright 2001)
Eric You XU 翻译,2007年4月
第二篇:人人都能学会的企业SHELL编程v2
人人都能学会的SHELL编程
目 录
1.Shell入门简介.......................................................................................................2 2.Shell编程之变量详解...........................................................................................5 3.If条件语句学习.....................................................................................................8 4.使用if条件语句编写MySQL备份脚本..............................................................10 5.IF条件综合Shell实战脚本编写.......................................................................11 6.循环语句for.........................................................................................................20 7.循环语句while.....................................................................................................22 8.Until循环语句.....................................................................................................23 9.Case选择语句.......................................................................................................23 10.select选择语句.................................................................................................25 11.Shell编程函数讲解...........................................................................................25 12.Shell数组编程...................................................................................................27 13.Shell编程之awk、sed命令案例分析.............................................................30 14.全备和增量备份Linux系统脚本......................................................................31 15.Shell编程之系统硬件信息数据库收集...........................................................34 16.Shell编程之磁盘报警高级脚本.......................................................................37 17.Shell编程之服务监控检查脚本.......................................................................40 18.Shell编程之实战WEB界面展示一...................................................................40 19.Shell编程之实战WEB界面展示二...................................................................40 20.Shell编程之学习心得分享及拓展...................................................................40
1.Shell入门简介
说到Shell编程,我想很多从事Linux运维工作的朋友都不陌生,都对Shell有基本的了解,可能大家刚开始接触Shell的时候,有各种想法? 能不能不学? 高大上?
到底是浮云?还是神马?
很难啊?
我想告诉大家的是,大家有这些想法一点都不觉得惊讶,为什么?这些都很正常,对于任何一件事情在未开始之前,肯定会有总总假设,那我今天想说的是,学完人人都会Shell编程后,我们会觉得一切的Shell都是浮云,我们每个人都能很好的使用它,驾驭它,更好的完成我们日常运维的工作。
曾经有人说过,玩Linux不知道Shell,那就是不懂Linux;现在细细品味确实是这样。为了让更多的人能接触Shell、了解Shell,使用Shell,所以今天开设了这样一个网络课程,让我们的Shell飞起来。
好的,其他不多说了,我们正式进入主题,什么是Shell呢? Shell是操作系统的最外层,Shell可以合并编程语言以控制进程和文件,以及启动和控制其它程序。shell 通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出来管理您与操作系统之间的交互。简单来说Shell就是一个用户跟操作系统之间的一个命令解释器。
Shell是用户与Linux操作系统之间沟通的桥梁。用户可以输入命令执行,又可以利用 Shell脚本编程去运行。
Linux Shell种类非常多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh)等。不同的Shell语言的语法有所不同,所以不能交换使用。
最常用的shell是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用,也是大多数Linux系统默认的Shell。接下来我们来写一个简单的shell脚本。(shell脚本一般文件名以.sh结尾,同时文件第一行定义该脚本为shell脚本)vi first_shell.sh #!/bin/bash #This is my First shell echo “Hello World!”
这就是我们的第一个脚本,是不是很简单呢,注解如下:
#!/bin/bash //表示定义该脚本是一个shell脚本(固定格式)。#This is my First shell //这里的#号属于注解,没有任何的意义,SHELL不会解析它。
echo “Hello World!” //shell脚本主命令,我们执行这个脚本讲看到: Hello World!信息。
脚本编写完毕,如何来执行呢,首先执行shell脚本需要执行权限,赋予执行权限:
chmod o+x first_shell.sh 然后./first_shell.sh执行即可;也可以直接使用命令执行: /bin/sh first_shell.sh,显示效果一样。2.Shell编程之变量详解
Shell编程语言是非类型的解释型语言,不像C++/JAVA语言编程时需要事先声明变量,SHELL给一个变量赋值,实际上就是定义了变量,在Linux支持的所有shell中,都可以用赋值符号(=)为变量赋值。SHELL变量可分为两类:局部变量和环境变量。局部变量只在创建它们的shell脚本中使用。而环境变量则可以在创建它们的shell及其派生出来的任意子进程中使用。有些变量是用户创建的,其他的则是专用shell变量。
例如在脚本里面定义A=123 ,定义这样一个变量,前面变量名,后面是变量的值。
引用变量可以使用$A,把变量放在脚本里面会出现什么样的效果呢?如下: #!/bin/bash #Author wugk 2014-06-10 A=123 echo “Printf variables equal is $A” 执行脚本:sh test.sh,结果将会显示: Printf variables equal is 123 简单的理解变量,相当于定义一个别名-名称,引用的时候加上$符号就可以了。
例如定义变量 name=wuguangke 执行echo $name 将会显示wuguangke SHELL常见的系统变量解析: $0 当前程序的名称
$n 当前程序的第n个参数,n=1,2,„9 $* 当前程序的所有参数(不包括程序本身)$# 当前程序的参数个数(不包括程序本身)$? 命令或程序执行完后的状态,一般返回0表示执行成功。$UID 当前用户的ID $PWD 当前所在的目录
我们来测试一个常用变量的脚本:vi auto_var.sh #!/bin/bash #auto print variables #by wugk 2014-09 echo-e ' 33[32m----------------------------- 33[0m' echo “This is $0 param!” echo “This $1 is $1 param!” echo “This $2 is $2 param!” echo-e ' 33[32m----------------------------- 33[0m' echo “This $* is $* param!” echo “This $# is $# param!” echo “This $? is $? param!” echo
紧接着我们来编写一个简单的echo打印菜单: #!/bin/bash #auto install httpd #by wugk 2014-09 echo-e ' 33[32m----------------------------- 33[0m' FILES=httpd-2.2.17.tar.bz2 URL=http://mirrors.cnnic.cn/apache/httpd/ PREFIX=/usr/local/apache2/ echo-e “ 33[36mPlease Select Install Menu: 33[0m” echo echo “1)官方下载Httpd文件包.” echo “2)解压apache源码包.” echo “3)编译安装Httpd服务器.” echo “4)启动HTTPD服务器.” echo-e ' 33[32m----------------------------- 33[0m' sleep 20
3.If条件语句学习
在Linux Shell编程中,if、for、while、case等条件流程控制语句用的非常多,把这些学好,对提升脚本的功力有非常大的帮助。下面将逐个来讲解具体的用法: If条件判断语句
if(表达式)#if(Variable in Array)语句1 else 语句2 fi 案例一,测试数字大小 #!/bin/sh NUM=100 if(($NUM > 4));then echo “this num is $NUM greater 4!” fi 案例二,测试目录是否存在,不存在则新建(注意,中括号之间必须要空格)#!/bin/sh #judge dir exist if [!-d /data/20140515 ];then mkdir-p /data/20140515 else echo “This DIR is exist,Please exit „..” fi 逻辑运算符解析:
-f 判断文件是否存在 eg: if [-f filename ]-d 判断目录是否存在 eg: if [-d dir ]-eq 等于 应用于:整型比较-ne 不等于 应用于:整型比较-lt 小于 应用于:整型比较-gt 大于 应用于:整型比较-le 小于或等于 应用于:整型比较-ge 大于或等于 应用于:整型比较
-a 双方都成立(and)逻辑表达式 –a 逻辑表达式-o 单方成立(or)逻辑表达式 –o 逻辑表达式-z 空字符串
案例三,多个条件测试判断 #!/bin/sh scores=80 if [[ $scores-gt 85 ]];then echo “very good!”;elif [[ $scores-gt 75 ]];then echo “good!”;elif [[ $scores-gt 60 ]];then echo “pass!”;else echo “no pass!” fi 4.使用if条件语句编写MySQL备份脚本 a)自动备份Mysql数据库脚本 #!/bin/sh #auto backup mysql #wugk 2012-12-12 #Define PATH定义变量
BAKDIR=/data/backup/mysql/`date +%Y-%m-%d` MYSQLDB=webapp MYSQLPW=backup MYSQLUSR=backup #must use root user run scripts 必须使用root用户运行,$UID为系统变量 if
[ $UID-ne 0 ];then echo This script must use the root user!!sleep 2 exit 0 fi #Define DIR and mkdir DIR 判断目录是否存在,不存在则新建 if [!-d $BAKDIR ];then mkdir-p $BAKDIR else echo This is $BAKDIR exists....fi #Use mysqldump backup mysql 使用mysqldump备份数据库 /usr/bin/mysqldump-u$MYSQLUSR-p$MYSQLPW-d $MYSQLDB >$BAKDIR/webapp_db.sql echo “The mysql backup successfully ” 5.IF条件综合Shell实战脚本编写
通过if语句和之前变量的学习,今天我们将把我们所学的综合在一起来讲解一个实战运维脚本,一键安装LAMP环境的脚本: 一键源码安装LAMP脚本,先分解脚本的各个功能: 打印菜单:
1)安装apache WEB服务器 2)安装Mysql DB服务器 3)安装PHP 服务器
4)整合LAMP架构并启动服务
1、Apache服务器安装部署。
下载httpd-2.2.27.tar.gz版本,下载URL,解压,进入安装目录,configure;make;make install
2、Mysql服务器的安装。
下载mysql-5.5.20.tar.bz2版本,下载URL,解压,进入安装目录,configure;make;make install
3、PHP服务器安装。
下载php-5.3.8.tar.bz2版本,下载URL,解压,进入安装目录,configure;make;make install
4、LAMP架构的整合和服务启动。
/usr/local/apache2/bin/apachectl start vi htdocs/index.php vi auto_lamp.sh内容如下: #!/bin/bash #auto install LAMP #by wugk 2014-11 #Httpd define path variable H_FILES=httpd-2.2.27.tar.bz2 H_FILES_DIR=httpd-2.2.27 H_URL=http://mirrors.cnnic.cn/apache/httpd/ H_PREFIX=/usr/local/apache2/
#MySQL define path variable M_FILES=mysql-5.5.20.tar.gz M_FILES_DIR=mysql-5.5.20 M_URL=http://down1.chinaunix.net/distfiles/ M_PREFIX=/usr/local/mysql/
#PHP define path variable P_FILES=php-5.3.28.tar.bz2 P_FILES_DIR=php-5.3.28 P_URL=http://mirrors.sohu.com/php/ P_PREFIX=/usr/local/php5/ echo-e ' 33[32m----------------------------- 33[0m' echo
if [-z “$1” ];then
echo-e “ 33[36mPlease Select Install Menu follow: 33[0m” echo-e “ 33[32m1)编译安装Apache服务器 33[1m” echo “2)编译安装MySQL服务器” echo “3)编译安装PHP服务器” echo “4)配置index.php并启动LAMP服务” echo-e “ 33[31mUsage: { /bin/sh $0 1|2|3|4|help} 33[0m” exit fi
if [[ “$1”-eq “help” ]];then echo-e “ 33[36mPlease Select Install Menu follow: 33[0m” echo-e “ 33[32m1)编译安装Apache服务器 33[1m” echo “2)编译安装MySQL服务器” echo “3)编译安装PHP服务器” echo “4)配置index.php并启动LAMP服务” echo-e “ 33[31mUsage: { /bin/sh $0 1|2|3|4|help} 33[0m” exit fi
### #Install httpd web server if [[ “$1”-eq “1” ]];then
wget-c $H_URL/$H_FILES && tar-jxvf $H_FILES && cd $H_FILES_DIR &&./configure--prefix=$H_PREFIX if [ $?-eq 0 ];then
make && make install
echo-e “n 33[32m---------------- 33[0m”
echo-e “ 33[32mThe $H_FILES_DIR Server Install Success! 33[0m” else
echo-e “ 33[32mThe $H_FILES_DIR Make or Make install ERROR,Please Check......”
exit 0 fi fi
#Install Mysql DB server if [[ “$1”-eq “2” ]];then
wget-c $M_URL/$M_FILES && tar-xzvf $M_FILES && cd $M_FILES_DIR &&yum install cmake-y;cmake.-DCMAKE_INSTALL_PREFIX=$M_PREFIX-DMYSQL_UNIX_ADDR=/tmp/mysql.sock-DMYSQL_DATADIR=/data/mysql-DSYSCONFDIR=/etc-DMYSQL_USER=mysql-DMYSQL_TCP_PORT=3306-DWITH_XTRADB_STORAGE_ENGINE=1-DWITH_INNOBASE_STORAGE_ENGINE=1-DWITH_PARTITION_STORAGE_ENGINE=1-DWITH_BLACKHOLE_STORAGE_ENGINE=1-DWITH_MYISAM_STORAGE_ENGINE=1-DWITH_READLINE=1-DENABLED_LOCAL_INFILE=1-DWITH_EXTRA_CHARSETS=1-DDEFAULT_CHARSET=utf8-DDEFAULT_COLLATION=utf8_general_ci-DEXTRA_CHARSETS=all-DWITH_BIG_TABLES=1-DWITH_DEBUG=0 make && make install
/bin/cp support-files/my-small.cnf /etc/my.conf /bin/cp support-files/mysql.server /etc/init.d/mysqld chmod +x /etc/init.d/mysqld chkconfig--add mysqld chkconfig mysqld on
if [ $?-eq 0 ];then make && make install echo-e “n 33[32m---------------- 33[0m” echo-e “ 33[32mThe $M_FILES_DIR Server Install Success! 33[0m” else echo-e “ 33[32mThe $M_FILES_DIR Make or Make install ERROR,Please Check......” exit 0 fi fi
#Install PHP server if [[ “$1”-eq “3” ]];then
wget-c $P_URL/$P_FILES && tar-jxvf $P_FILES && cd $P_FILES_DIR &&./configure--prefix=$P_PREFIX--with-config-file-path=$P_PREFIX/etc--with-mysql=$M_PREFIX--with-apxs2=$H_PREFIX/bin/apxs if [ $?-eq 0 ];then make ZEND_EXTRA_LIBS='-liconv' && make install echo-e “n 33[32m---------------- 33[0m” echo-e “ 33[32mThe $P_FILES_DIR Server Install Success! 33[0m” else echo-e “ 33[32mThe $P_FILES_DIR Make or Make install ERROR,Please Check......” exit 0 fi fi
#
if [[ “$1”-eq “4” ]];then
sed-i '/DirectoryIndex/s/index.html/index.php index.html/g' $H_PREFIX/conf/httpd.conf $H_PREFIX/bin/apachectl restart
echo “AddType application/x-httpd-php.php” >>$H_PREFIX/conf/httpd.conf IP=`ifconfig eth1|grep “Bcast”|awk '{print $2}'|cut-d:-f2` echo “You can access http://$IP/”
cat >$H_PREFIX/htdocs/index.php <
#!/bin/sh for i in `seq 15` do
echo “NUM is $i”
done 案例二,求和1-100的值 #!/bin/bash #auto sum 1 100 j=0 for((i=1;i<=100;i++))do j=`expr $i + $j` done echo $j 案例三,找到相关log,然后批量打包 #!/bin/sh for i in `find /var/log-name “*.log”` do
tar –czf 2014log.tgz $i done 案例四,远程主机批量传输文件: #!/bin/bash #auto scp files for client #by authors wugk 2014 for i in `seq 100 200` do scp-r /tmp/test.txt root@192.168.1.$i:/data/webapps/www.xiexiebang.comnic.cn/apache/httpd/ H_PREFIX=/usr/local/apache2/ function Apache_install(){ #Install httpd web server if [[ “$1”-eq “1” ]];then
wget-c $H_URL/$H_FILES && tar-jxvf $H_FILES && cd $H_FILES_DIR &&./configure--prefix=$H_PREFIX if [ $?-eq 0 ];then
make && make install
echo-e “n 33[32m---------------- 33[0m”
echo-e “ 33[32mThe $H_FILES_DIR Server Install Success! 33[0m” else
echo-e “ 33[32mThe $H_FILES_DIR Make or Make install ERROR,Please Check......”
exit 0 fi fi } Apache_install直接调用函数就会去运行函数里面定义的代码了。12.Shell数组编程
数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字成为数组名,编号成为下标。
今天这里我们来探讨一维数组的定义、统计、引用和删除等操作。首先来定义一个一维数组:
A=(test1 test2 test3),定义数组一般以括号的方式来定义,数组的值可以随机定义。如何来引用呢? echo ${A[0]},代表引用第一个数组变量,结果会显示test1,数组引用从0开始,代表第一个数组,依次类推。
echo ${A[1]},代表引用第二个数组变量,结果会显示test2,数组引用也是从0开始计算的。
如何显示该数组所有参数呢?echo ${A[@]} 将显示所有参数test1 test2 test3。
如何显示该数组参数个数呢?echo ${#A[@]} 将显示该数组的参数个数3。
如果替换某个数组呢?例如替换第二个test2数组为test5:echo ${A[@]/test2/test5} 如何删除一个数组呢?例如删除test3数组命令为:unset A[2];echo ${A[@]}查看效果。
那输入如何在编程来使用呢?请看下面例子: #!/bin/sh #Auto Make KVM Virtualization #Auto config bond scripts eth_bond(){ NETWORK=(HWADDR=`ifconfig eth0 |egrep “HWaddr|Bcast” |tr “n” “ ”|awk '{print $5,$7,$NF}'|sed-e 's/addr://g'-e 's/Mask://g'|awk '{print $1}'` IPADDR=`ifconfig eth0 |egrep “HWaddr|Bcast” |tr “n” “ ”|awk '{print $5,$7,$NF}'|sed-e 's/addr://g'-e 's/Mask://g'|awk '{print $2}'` NETMASK=`ifconfig eth0 |egrep “HWaddr|Bcast” |tr “n” “ ”|awk '{print $5,$7,$NF}'|sed-e 's/addr://g'-e 's/Mask://g'|awk '{print $3}'` GATEWAY=`route-n|grep “UG”|awk '{print $2}'`)cat >ifcfg-bond0< 在我们日常的Shell编程中我们会用到很多的一些语句,有的语句,如果用好了,可以让我们的脚本更上一层楼,让我们的功能更容易满足企业的需求。Sed命令: sed 's/192/10/g' test.txt 把文件里面的192字符替换为10 在文件开头或者结尾添加字符: Awk命令: Find命令: Grep正则: 14.全备和增量备份Linux系统脚本 在Linux中,我们经常需要备份系统重要文件,例如/etc、/boot分区、重要网站数据等等,如果每天都完整备份的话,会占用很大的空间,那我们改如何来备份呢? 这里采用如下方法来备份: 每周日进行完整备份,其余每天为增量备份。那使用什么命令来备份呢,我们使用tar命令: 全备份:tar-g /tmp/snapshot-czvf /tmp/2014_full_system_data.tar.gz /data/sh/ 增量备: tar-g /tmp/snapshot-czvf /tmp/2014_add01_system_data.tar.gz /data/sh/ #!/bin/sh #Automatic Backup Linux System Files #Author wugk 2013-11-22 #Define Variable SOURCE_DIR=($*)TARGET_DIR=/data/backup/ YEAR=`date +%Y` MONTH=`date +%m` DAY=`date +%d` WEEK=`date +%u` A_NAME=`date +%H%M` FILES=system_backup.tgz CODE=$? if [-z “$*” ];then echo-e “ 33[32mUsage:nPlease Enter Your Backup Files or Directoriesn-------------nnUsage: { $0 /boot /etc} 33[0m” exit fi #Determine Whether the Target Directory Exists if [!-d $TARGET_DIR/$YEAR/$MONTH/$DAY ];then mkdir-p $TARGET_DIR/$YEAR/$MONTH/$DAY echo-e “ 33[32mThe $TARGET_DIR Created Successfully! 33[0m” fi #EXEC Full_Backup Function Command Full_Backup(){ if [ “$WEEK”-eq “7” ];then rm-rf $TARGET_DIR/snapshot cd $TARGET_DIR/$YEAR/$MONTH/$DAY;tar-g $TARGET_DIR/snapshot-czvf $FILES ${SOURCE_DIR[@]} [ “$CODE” == “0” ]&&echo-e “-------------n 33[32mThese Full_Backup System Files Backup Successfully! 33[0m” fi } #Perform incremental BACKUP Function Command Add_Backup(){ if [ $WEEK-ne “7” ];then cd $TARGET_DIR/$YEAR/$MONTH/$DAY;tar-g $TARGET_DIR/snapshot-czvf $A_NAME$FILES ${SOURCE_DIR[@]} [ “$CODE” == “0” ]&&echo-e “----------n 33[32mThese Add_Backup System Files $TARGET_DIR/$YEAR/$MONTH/$DAY/${YEAR}_$A_NAME$FILES Backup Successfully! 33[0m” fi } sleep 3 Full_Backup;Add_Backup 15.Shell编程之系统硬件信息数据库收集 首先我们创建数据库表,格式如下: CREATE TABLE `audit_audit_system`(`id` int(11)NOT NULL AUTO_INCREMENT,`ip_info` varchar(50)NOT NULL,`serv_info` varchar(50)NOT NULL,`cpu_info` varchar(50)NOT NULL,`disk_info` varchar(50)NOT NULL,`mem_info` varchar(50)NOT NULL,`load_info` varchar(50)NOT NULL,`mark_info` varchar(50)NOT NULL,PRIMARY KEY(`id`),UNIQUE KEY `ip_info`(`ip_info`),UNIQUE KEY `ip_info_2`(`ip_info`));然后编写脚本如下: #!/bin/sh #auto get system info #author wugk 2014-08-29 echo-e “ 33[34m 33[1m” cat < ++++++++++++++++++++++++++++++++++++++++++++++ ++++++++Welcome to use system Collect+++++++++ ++++++++++++++++++++++++++++++++++++++++++++++ EOF ip_info=`ifconfig |grep “Bcast”|tail-1 |awk '{print $2}'|cut-d:-f 2` cpu_info1=`cat /proc/cpuinfo |grep 'model name'|tail-1 |awk-F: '{print $2}'|sed 's/^ //g'|awk '{print $1,$3,$4,$NF}'` cpu_info2=`cat /proc/cpuinfo |grep “physical id”|sort |uniq-c|wc-l` serv_info=`hostname |tail-1` disk_info=`fdisk-l|grep “Disk”|grep-v “identifier”|awk '{print $2,$3,$4}'|sed 's/,//g'` mem_info=`free-m |grep “Mem”|awk '{print “Total”,$1,$2“M”}'` load_info=`uptime |awk '{print “Current Load: ”$(NF-2)}'|sed 's/,//g'` mark_info='BeiJing_IDC' echo-e “ 33[32m------------ 33[1m” echo IPADDR:${ip_info} echo HOSTNAME:$serv_info echo CPU_INFO:${cpu_info1} X${cpu_info2} echo DISK_INFO:$disk_info echo MEM_INFO:$mem_info echo LOAD_INFO:$load_info echo-e “ 33[32m------------ 33[0m” echo-e-n “ 33[36mYou want to write the data to the databases? 33[1m”;read ensure if “Y” ];then echo “-------------” [ “$ensure” == “yes”-o “$ensure” == “y”-o “$ensure” == echo-e ' 33[31mmysql-uaudit-p123456-D audit-e ''' “insert into audit_audit_system values('','${ip_info}','$serv_info','${cpu_info1} X${cpu_info2}','$disk_info','$mem_info','$load_info','$mark_info')” ''' 33[0m ' else fi 读取数据库信息: mysql-uroot-p123-e 'use wugk1;select * from audit_audit_system;'|sed 's/-//g'|grep-v “id” 这样,我们可以把数据库的内容在shell脚本里面调用出来。16.Shell编程之磁盘报警高级脚本 echo “wait exit......” exit 脚本分析: 1、磁盘达到85%发送报警邮件。 2、发送邮件命令格式。 3、多个报警设置。 4、把分区的信息写入文件。 Mail-s “邮件主题”-c”抄送地址”-b “密送地址”-f 发送人邮件地址 –F 发件人姓名 < 要发送的邮件内容 #!/bin/sh #auto monitor disk #by authors wugk 2014 echo-e “ 33[31m 33[1m” rm-rf list.txt LIST=`df-h |grep “^/dev/” >>list.txt` cat << EOF +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++welcome to use auto monitor system++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EOF echo-e “ 33[32m---------------------------- 33[0m” echo sleep 2 while read line do IP_ADDR=`ifconfig eth1|grep “Bcast”|awk '{print $2}'|cut-d:-f 2` D_Name=`echo $line|awk '{print $1,$NF“分区”}'` D_Total=`echo $line|awk '{print $2}'` D_Avail=`echo $line|awk '{print $4}'` D_Percent=`echo $line|awk '{print $5}'|sed 's/%//g'` if [ “$D_Percent”-ge 50 ];then cat >email.txt < 日期/时间: 周二 2014年11月11日 15时:15分:53秒 CST 额外信息: CRITICAL-DISK Monitor:$D_Name Used more than ${D_Percent}% EOF EOF echo-e “ 33[32mThe $D_Name has been used for more than ${D_Percent}% ,Please Check. 33[0m” mail-s “$D_Name Warning” wgkgood@163.com #echo “The $D_Name has been used for more than ${D_Percent}% ,Please Check.”|mail-s “$D_Name Warning” wgkgood@163.com fi done