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

  • 相关阅读:
    mysql5.6 sql_mode设置为宽松模式
    utf-8 编码问题
    阿里云服务器挂载云盘
    maven打包含有多个main程序的jar包及运行方式
    AndroidStudio OpenCv的配置,不用安装opencv manager
    图片标注工具LabelImg使用教程
    关于tensorboard启动问题
    IntelliJ IDEA 最新激活码(截止到2018年10月14日)
    JetBrains C++ IDE CLion配置与评测
    Win10下Clion配置opencv3
  • 原文地址:https://www.cnblogs.com/fnng/p/2542774.html
Copyright © 2011-2022 走看看