linux那点事儿(八)----shell编程
linux那点事儿(八)----shell编程
相关链接:
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 output
echo "We are currently in the following directory."
/bin/pwd
echo
echo "This directory contains the following files"
/bin/ls www.2cto.com
shell结构:
#!/bin/sh
表示下面脚本要使用系统中的Bourne shell解释器来解释执行。#!是特殊的表示符,其后面根的是
此解释此脚本的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 ---显示当前路径 www.2cto.com
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是一个解释性的语言。
不知道你是熟悉DOS下的批处理。他们类似,都是把我们平操作的一组命令放到一起执行。
shell是一个解释性的语言。
其实我们会发现这样的编程对我们系统的依赖性比较强。比如:/bin/pwd 执行pwd命令,
假如在你的系统上pwd不是放在bin/目录下,那么程序运行到这里可能就会出错了。
假如在你的系统上pwd不是放在bin/目录下,那么程序运行到这里可能就会出错了。
比较正规的解释:
Shell基本上是一个命令解释器,类似于DOS下的command.com。它接收用户命令(如ls等),
然后调用相应的应用程序。较为通用的shell有标准的Bourne shell (sh)和C shell (csh)。
然后调用相应的应用程序。较为通用的shell有标准的Bourne shell (sh)和C shell (csh)。
交互式shell和非交互式shell
交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是
因为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有两种类变量:临时变量和永久变量
临时变量是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 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
/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"
www.2cto.com
[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,如果服务器挂了呢。就重启一下。
(当然,这并不能从跟本上解决这一问题)
然后呢,这个服务器就经常挂掉,学校呢又没钱加设备。现在,我们来写一个shell程序,
让其每两分钟检测一下apache,如果服务器挂了呢。就重启一下。
(当然,这并不能从跟本上解决这一问题)
如何判断一个apache 是否启动?
[root@bogon bin]# pgrep httpd
7942 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 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.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
最后一个例子中有使用。shell编程可以是一本很厚很厚的书。不过,它不是我目前学习重点。
有时间的话,我会再补充一篇shell的内容。 www.2cto.com
从今年年初开始学习linux到现在算是告一段落,其实,在学习的过程中遇到了很多问题。
这个《linux那点事儿》只是把我学习的主线内容整理了下来。很高兴从基本上的一窍不通到现在
对linux略知一二,不过,这个学习,我觉得用得时间太长了,也许我可以在一两月就稿点。
可以今年经历了一次从北方到南方的换工作,而且现在的工作很忙,生活中各种琐事太多。
所以,学习时间好少。不过,我会坚持在这里继续书写着自己的工作和与学习。
这个《linux那点事儿》只是把我学习的主线内容整理了下来。很高兴从基本上的一窍不通到现在
对linux略知一二,不过,这个学习,我觉得用得时间太长了,也许我可以在一两月就稿点。
可以今年经历了一次从北方到南方的换工作,而且现在的工作很忙,生活中各种琐事太多。
所以,学习时间好少。不过,我会坚持在这里继续书写着自己的工作和与学习。
下面的学习,我会放在两个方面oracle 和性能测试。
我一直是个数据库白痴,并对数据库基本没有兴趣。但它是我技术发展的短板,所以,
我想花一点儿时间补习一下这方面知识。
我想花一点儿时间补习一下这方面知识。
性能测试一直是我喜欢的方面。目前的工作没有性能测试。但上一份工作中有做过性能。
下个目标就是去做专业的性能测试。loadrunner和jmeter都有玩过。
不过,我现在会把重点放在理论基础上,性能测试的重点不在工具,涉及的知识面很多。
略有所悟的话也会记录在这里。呵呵!
下个目标就是去做专业的性能测试。loadrunner和jmeter都有玩过。
不过,我现在会把重点放在理论基础上,性能测试的重点不在工具,涉及的知识面很多。
略有所悟的话也会记录在这里。呵呵!
作者 虫师
评论暂时关闭