linux那点事儿(八)----shell 编程
2012-06-09 01:34 虫师 阅读(8189) 评论(2) 编辑 收藏 举报
一个简单的shell程序
下面直接来看一个shell程序。
-----------------
#!/bin/sh
# This is to show what a example looks like.
echo "Our first example"
echo # This inserts an empty line in output
echo "We are currently in the following directory."
/bin/pwd
echo
echo "This directory contains the following files"
/bin/ls
shell结构:
#!/bin/sh
表示下面脚本要使用系统中的Bourne shell解释器来解释执行。#!是特殊的表示符,其后面根的是此解释此脚本的shell的路径。
# 注释行
本行内容起注释作用,内容不会被执行
echo 输出语句
相当于编程里print打印输出
/bin/pwd 显示当前路径
pwd你会常用,前面加/bin/表示这个命令的绝对路径
/bin/ls 显示当前目录下的内容
这个就不解释,玩linux这个应该是最先要知道的。
下面执行一下:
[root@bogon bin]# sh exple.sh
Out first example ---打印内容
we are currently in the following directory. ---打印内容
/bin ---显示当前路径
this directory contains the following files -----打印内容
alsaunmute date gettext mail red touch ---显示当前目录下的文件
arch dd grep mailx rm tracepath
ash df gtar mkdir rmdir tracepath6
ash.static dmesg gunzip mknod rpm traceroute
aumix-minimal dnsdomainname gzip mktemp rvi traceroute6
awk doexec hostname more rview true
basename 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 变量
我们对shell是不是有了初步的认识,那么它只是简单的命令集合么?no!身为一门语言,他当然也有自己的语法。如下你懂任何一门语言的话,下面来看shell与你所知道的语言有什么不同。
变量:是shell传递数据的一种方法,用来代表每个取值的符号名。
shell有两种类变量:临时变量和永久变量
临时变量是shell程序内部定义的,其使用范围仅限于定义它的程序,对其它程序不可见。
包括:用户定义变量、位置变量。
用户自定义变量的格式要求:
由字每或下划线开头,由字母、数字或下划线序列组成,并且大小写字母意义不同。变量名长度没有限制。
在使用变量时,要在变量名前加上前缀“$”(我记得php就特钟爱这个符号^_^)
一般变量名会用大写字符
如:
MUM=100 定义时赋值
TIME=$(date) 将一个命令的执行结果赋值给变量,
A=$B 将一个变量复制给另一个变量
定义并查看一个变量:
[root@bogon ~]# NUM=100
[root@bogon ~]# echo $NUM
100
[root@bogon ~]# TIME=$(date)
[root@bogon ~]# echo $TIME
五 6月 1 22:57:28 CST 2012
[root@bogon ~]# B=fnngj
[root@bogon ~]# echo $B
fnngj
[root@bogon ~]# A=$B
[root@bogon ~]# echo $A
fnngj
永久变量是环境变量,其值不随shell脚本的执行结束而消失。
[root@bogon ~]# echo $LANG
zh_CN.UTF-8
[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 | more
A=fnngj
B=fnngj
BASH=/bin/bash
BASH_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.xterm
COLUMNS=80
.............
删除变量:
[root@bogon ~]# unset A
执行unset命令就可以将一个变量删除
read 命令
这个命令比较有意思,但在变成中也很常见,比如程序运行到某一句时停下来要求用户输入内容,然后根据用户输入的内容继续执行。
read命令:从键盘读入数据,赋值给变量
如:read USERNSME
[root@bogon shell]# touch read.sh
[root@bogon shell]# vi read.sh
#! /bin/sh
read first second third
echo "the first parameter is $first"
echo "the second parameter is $second"
echo "the third parameter is $third"
[root@bogon shell]# sh read.sh
100 200 300 ---------------此处要求用户输入参数
the first parameter is 100
the second parameter is 200
the third parameter is 300
shell变量的算术运算
算术运算也是我们在经常使用到的,下面我们来看shell 简单的加减乘除。
expr命令:对整数型变量进行算术运算
例如:
[root@localhost ~]# expr 3+5
3+5
[root@localhost ~]# expr 3 + 5
8
[root@localhost ~]# expr 9 - 5
4
[root@localhost ~]# expr 9 / 5
1
[root@localhost ~]# expr 9 \* 5
45
这个除法就是整除,所以9除5等于1,直接把余下的4忽视了。
这个乘法, 因为星号(*)还有其它含义,如你在查找时*代表一位未知字符,所以要想把它当乘号用,这里里要加转义符号(\)
一个shell实例
前面有讲到任务计划,现在我们来根据任务计划来写一个有意义的shell程序。
话说一个学校里有一台很垃圾的apache服务器,晚上八点到十点访问这个服务器的学生很多,然后呢,这个服务器就经常挂掉,学校呢又没钱加设备。现在,我们来写一个shell程序,让其每两分钟检测一下apache,如果服务器挂了呢。就重启一下。(当然,这并不能从跟本上解决这一问题)
如何判断一个apache 是否启动?
[root@bogon bin]# pgrep httpd
7942 7944 7946 7947 7948 7950
如果服务器已经挂掉的话,输入pgrep httpd 将没有任何输入。
我们已经知道了判断方法,下面就可以开始写这个程序了test.apache
-------------------------------
#!/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 service
web='/usr/bin/pgrep httpd'
if["$web"!=""]
then
echo "the web sercice is running."
else
echo "the web sercice is running."
/etc/rc.d/init.d/httpd start
fi
-----------------------------------
其实,核心内容就是判断pgrep httpd 为空的执行重启命令。^_^!
关于任务计划,在《linux那点事儿(六)---进程管理详解》一章有介绍。
关于上面参数的含义:http://www.cnblogs.com/fnng/archive/2012/05/20/2510641.html
[root@bogon test]# crontab -e
*/2 20-22 * * 1-7 test.apache
:wq!
保存退出。
然后,就没我们什么事儿了。根据计划执行脚本。呵呵!
--------------------------------------------------------------------------------------------------------
后记:
关于shell编程,我这里介绍的很少,甚至连循环语句(if....else )都没有介绍。最后一个例子中有使用。shell编程可以是一本很厚很厚的书。不过,它不是我目前学习重点。有时间的话,我会再补充一篇shell的内容。
从今年年初开始学习linux到现在算是告一段落,其实,在学习的过程中遇到了很多问题。这个《linux那点事儿》只是把我学习的主线内容整理了下来。很高兴从基本上的一窍不通到现在对linux略知一二,不过,这个学习,我觉得用得时间太长了,也许我可以在一两月就稿点。可以今年经历了一次从北方到南方的换工作,而且现在的工作很忙,生活中各种琐事太多。所以,学习时间好少。不过,我会坚持在这里继续书写着自己的工作和与学习。
下面的学习,我会放在两个方面oracle 和性能测试。
我一直是个数据库白痴,并对数据库基本没有兴趣。但它是我技术发展的短板,所以,我想花一点儿时间补习一下这方面知识。
性能测试一直是我喜欢的方面。目前的工作没有性能测试。但上一份工作中有做过性能。下个目标就是去做专业的性能测试。loadrunner和jmeter都有玩过。不过,我现在会把重点放在理论基础上,性能测试的重点不在工具,涉及的知识面很多。略有所悟的话也会记录在这里。呵呵!