开发者社区> 虫师2016> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介:
+关注继续查看

一个简单的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都有玩过。不过,我现在会把重点放在理论基础上,性能测试的重点不在工具,涉及的知识面很多。略有所悟的话也会记录在这里。呵呵!

 

 

 

 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Linux Shell常用技巧(四)
九.  awk实用功能:    和sed一样,awk也是逐行扫描文件的,从第一行到最后一行,寻找匹配特定模板的行,并在这些行上运行“选择”动作。如果一个模板没有指定动作,这些匹配的行就被显示在屏幕上。如果一个动作没有模板,所有被动作指定的行都被处理。
721 0
Linux Shell常用技巧(五)
十一.  awk编程:    1.  变量:    在awk中变量无须定义即可使用,变量在赋值时即已经完成了定义。变量的类型可以是数字、字符串。根据使用的不同,未初始化变量的值为0或空白字符串" ",这主要取决于变量应用的上下文。
643 0
Linux Shell常用技巧(一)
一.    特殊文件: /dev/null和/dev/tty    Linux系统提供了两个对Shell编程非常有用的特殊文件,/dev/null和/dev/tty。其中/dev/null将会丢掉所有写入它的数据,换句换说,当程序将数据写入到此文件时,会认为它已经成功完成写入数据的操作,但实际上什么事都没有做。
790 0
Linux Shell常用技巧(九)
十九.  和系统运行进程相关的Shell命令:       1.  进程监控命令(ps):    要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而ps命令就是最基本同时也是非常强大的进程查看命令。
716 0
Linux Shell常用技巧(七)
十六. 文件查找命令find:    下面给出find命令的主要应用示例:    /> ls -l     #列出当前目录下所包含的测试文件    -rw-r--r--. 1 root root 48217 Nov 12 00:57 install.
767 0
Linux Shell常用技巧(十二)
二十三. Bash Shell编程:    1.  读取用户变量:    read命令是用于从终端或者文件中读取输入的内建命令,read命令读取整行输入,每行末尾的换行符不被读入。在read命令后面,如果没有指定变量名,读取的数据将被自动赋值给特定的变量REPLY。
807 0
Linux Shell常用技巧(十一)
二十二. 交互式使用Bash Shell:    1.  用set命令设置bash的选项:    下面为set主要选项的列表及其表述: 选项名 开关缩写 描述 allexport -a 打开此开关,所有变量都自动输出给子Shell。
724 0
Linux Shell常用技巧(二)
七. grep家族:       1.  grep退出状态:    0: 表示成功;    1: 表示在所提供的文件无法找到匹配的pattern;    2: 表示参数中提供的文件不存在。    见如下示例:    /> grep 'root' /etc/passwd    root:x:0:0:r...
691 0
Linux Shell常用技巧(十)
二十. 通过管道组合Shell命令获取系统运行数据:     1.  输出当前系统中占用内存最多的5条命令:    #1) 通过ps命令列出当前主机正在运行的所有进程。    #2) 按照第五个字段基于数值的形式进行正常排序(由小到大)。
1327 0
Linux Shell常用技巧(三)
八. 流编辑器sed:    sed一次处理一行文件并把输出送往屏幕。sed把当前处理的行存储在临时缓冲区中,称为模式空间(pattern space)。一旦sed完成对模式空间中的行的处理,模式空间中的行就被送往屏幕。
614 0
+关注
虫师2016
专注于软件测试技术的分享与推广
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Shell 脚本速查手册
立即下载
从 Linux 系统内核层面来解决实际问题的实战经验
立即下载
ECS系统指南之Linux系统诊断
立即下载