linux那点事儿(八)----shell编程

来源:岁月联盟 编辑:exp 时间:2012-06-11

相关链接:linux那点事儿(一)http://www.2cto.com/os/201205/131407.html;linux那点事儿(二)http://www.2cto.com/os/201205/131408.html;linux那点事儿(三)http://www.2cto.com/os/201205/131409.html;linux那点事儿(四)----用户管理详解http://www.2cto.com/os/201205/131410.html;linux那点事儿(五)----用户管理常用命令http://www.2cto.com/os/201205/131411.html;linux那点事儿(六)----进程管理详解http://www.2cto.com/os/201205/132474.html;linux那点事儿(七)----文件系统管理http://www.2cto.com/os/201205/133789.html 一个简单的shell程序                                                                   下面直接来看一个shell程序。----------------- #!/bin/sh# This is to show what a example looks like.echo "Our first example"echo # This inserts an empty line in outputecho "We are currently in the following directory."/bin/pwdechoecho "This directory contains the following files"/bin/ls   www.2cto.com   shell结构: #!/bin/sh 表示下面脚本要使用系统中的Bourne shell解释器来解释执行。#!是特殊的表示符,其后面根的是
此解释此脚本的shell的路径。 # 注释行本行内容起注释作用,内容不会被执行 echo 输出语句相当于编程里print打印输出/bin/pwd 显示当前路径pwd你会常用,前面加/bin/表示这个命令的绝对路径/bin/ls 显示当前目录下的内容这个就不解释,玩linux这个应该是最先要知道的。 下面执行一下:[root@bogon bin]# sh exple.shOut first example ---打印内容we are currently in the following directory. ---打印内容/bin ---显示当前路径  www.2cto.com  this directory contains the following files -----打印内容alsaunmute date gettext mail red touch ---显示当前目录下的文件arch dd grep mailx rm tracepathash df gtar mkdir rmdir tracepath6ash.static dmesg gunzip mknod rpm tracerouteaumix-minimal dnsdomainname gzip mktemp rvi traceroute6awk doexec hostname more rview truebasename domainname igawk mount sed exple.sh   很简单,这就是一个最简单的shell编程,只不过是把我平时用的一些命令整合到一起。
不知道你是熟悉DOS下的批处理。他们类似,都是把我们平操作的一组命令放到一起执行。
shell是一个解释性的语言。  其实我们会发现这样的编程对我们系统的依赖性比较强。比如:/bin/pwd 执行pwd命令,
假如在你的系统上pwd不是放在bin/目录下,那么程序运行到这里可能就会出错了。
 比较正规的解释:Shell基本上是一个命令解释器,类似于DOS下的command.com。它接收用户命令(如ls等),
然后调用相应的应用程序。较为通用的shell有标准的Bourne shell (sh)和C shell (csh)。
 交互式shell和非交互式shell  交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是
因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。
当你签退后,shell也终止了。  shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,
而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。
 创建shell程序的步骤:第一步:创建一个包含命令和控制结构的文件。第二步:修改这个文件的权限使它可以执行。当然,一个用户要执行一个文件,那么它对这个文件一定有执行权限。使用“ chmod u+x ”命令给用户加执行权限第三步:执行 ./example 在当前目录直接执行文件也可以使用“sh example”命令来执行 shell 变量    www.2cto.com                                                                                   我们对shell是不是有了初步的认识,那么它只是简单的命令集合么?no!身为一门语言,
他当然也有自己的语法。如下你懂任何一门语言的话,下面来看shell与你所知道的语言有什么不同。 变量:是shell传递数据的一种方法,用来代表每个取值的符号名。shell有两种类变量:临时变量和永久变量临时变量是shell程序内部定义的,其使用范围仅限于定义它的程序,对其它程序不可见。包括:用户定义变量、位置变量。用户自定义变量的格式要求:由字每或下划线开头,由字母、数字或下划线序列组成,并且大小写字母意义不同。
变量名长度没有限制。在使用变量时,要在变量名前加上前缀“$”(我记得php就特钟爱这个符号^_^)一般变量名会用大写字符如:MUM=100 定义时赋值TIME=$(date) 将一个命令的执行结果赋值给变量,A=$B 将一个变量复制给另一个变量定义并查看一个变量:[root@bogon ~]# NUM=100[root@bogon ~]# echo $NUM100[root@bogon ~]# TIME=$(date)[root@bogon ~]# echo $TIME五 6月 1 22:57:28 CST 2012[root@bogon ~]# B=fnngj[root@bogon ~]# echo $Bfnngj[root@bogon ~]# A=$B[root@bogon ~]# echo $Afnngj 永久变量是环境变量,其值不随shell脚本的执行结束而消失。[root@bogon ~]# echo $LANGzh_CN.UTF-8  www.2cto.com  [root@bogon ~]# echo $PATH/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:
/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin上面这些系统配置肯定不会随着我shell程序结束而消失。 看一下我们系统中都定义的哪些变量:[root@bogon ~]# set | moreA=fnngjB=fnngjBASH=/bin/bashBASH_ARGC=()BASH_ARGV=()BASH_LINENO=()BASH_SOURCE=()BASH_VERSINFO=([0]="3" [1]="00" [2]="15" [3]="1" [4]="release" [5]="i686-redhat-linux-gnu")BASH_VERSION='3.00.15(1)-release'COLORS=/etc/DIR_COLORS.xtermCOLUMNS=80.............删除变量:[root@bogon ~]# unset A执行unset命令就可以将一个变量删除 read 命令                                                                                     这个命令比较有意思,但在变成中也很常见,比如程序运行到某一句时停下来要求用户
输入内容,然后根据用户输入的内容继续执行。read命令:从键盘读入数据,赋值给变量如:read USERNSME [root@bogon shell]# touch read.sh[root@bogon shell]# vi read.sh#! /bin/shread first second thirdecho "the first parameter is $first"echo "the second parameter is $second"echo "the third parameter is $third"    www.2cto.com  [root@bogon shell]# sh read.sh100 200 300       ---------------此处要求用户输入参数the first parameter is 100the second parameter is 200the third parameter is 300 shell变量的算术运算                                                                     算术运算也是我们在经常使用到的,下面我们来看shell 简单的加减乘除。expr命令:对整数型变量进行算术运算例如:[root@localhost ~]# expr 3+53+5[root@localhost ~]# expr 3 + 58[root@localhost ~]# expr 9 - 54[root@localhost ~]# expr 9 / 51[root@localhost ~]# expr 9 /* 545这个除法就是整除,所以9除5等于1,直接把余下的4忽视了。这个乘法, 因为星号(*)还有其它含义,如你在查找时*代表一位未知字符,
所以要想把它当乘号用,这里里要加转义符号(/) 一个shell实例                                                                              前面有讲到任务计划,现在我们来根据任务计划来写一个有意义的shell程序。  话说一个学校里有一台很垃圾的apache服务器,晚上八点到十点访问这个服务器的学生很多,
然后呢,这个服务器就经常挂掉,学校呢又没钱加设备。现在,我们来写一个shell程序,
让其每两分钟检测一下apache,如果服务器挂了呢。就重启一下。
(当然,这并不能从跟本上解决这一问题)如何判断一个apache 是否启动?[root@bogon bin]# pgrep httpd7942  7944   7946    7947   7948   7950如果服务器已经挂掉的话,输入pgrep httpd 将没有任何输入。我们已经知道了判断方法,下面就可以开始写这个程序了test.apache-------------------------------  www.2cto.com  #!/bin/sh#"if....else" usage# using this program to show your system's service.echo "now, the web services of this linux system will be detect..."echo # Detesct www serviceweb='/usr/bin/pgrep httpd'if["$web"!=""]thenecho "the web sercice is running."elseecho "the web sercice is running."/etc/rc.d/init.d/httpd startfi -----------------------------------其实,核心内容就是判断pgrep httpd 为空的执行重启命令。^_^!关于任务计划,在《linux那点事儿(六)---进程管理详解》一章有介绍。关于上面参数的含义:http://www.2cto.com/os/201205/132474.html [root@bogon test]# crontab -e*/2   20-22  *   *   1-7   test.apache:wq!保存退出。然后,就没我们什么事儿了。根据计划执行脚本。呵呵!--------------------------------------------------------------------------------------------------------        后记:          关于shell编程,我这里介绍的很少,甚至连循环语句(if....else )都没有介绍。
最后一个例子中有使用。shell编程可以是一本很厚很厚的书。不过,它不是我目前学习重点。
有时间的话,我会再补充一篇shell的内容。  www.2cto.com           从今年年初开始学习linux到现在算是告一段落,其实,在学习的过程中遇到了很多问题。
这个《linux那点事儿》只是把我学习的主线内容整理了下来。很高兴从基本上的一窍不通到现在
对linux略知一二,不过,这个学习,我觉得用得时间太长了,也许我可以在一两月就稿点。
可以今年经历了一次从北方到南方的换工作,而且现在的工作很忙,生活中各种琐事太多。
所以,学习时间好少。不过,我会坚持在这里继续书写着自己的工作和与学习。   下面的学习,我会放在两个方面oracle 和性能测试。       我一直是个数据库白痴,并对数据库基本没有兴趣。但它是我技术发展的短板,所以,
我想花一点儿时间补习一下这方面知识。       性能测试一直是我喜欢的方面。目前的工作没有性能测试。但上一份工作中有做过性能。
下个目标就是去做专业的性能测试。loadrunner和jmeter都有玩过。
不过,我现在会把重点放在理论基础上,性能测试的重点不在工具,涉及的知识面很多。
略有所悟的话也会记录在这里。呵呵!   作者 虫师