zoukankan      html  css  js  c++  java
  • bash脚本编程知识储备

    bash脚本编程:

        脚本程序:解释器解释执行;

    1. 首先得理清一些琐碎的知识点,我尽量把我所学的帮朋友一起梳理一下
      1. 编程环境:(我会在接下来的篇章,图文例子三结合的方式带大家一起学习)

                     流程控制语句;

                         顺序执行;

                     循环执行;

                       选择执行;

      2.         bash变量是弱类型;默认字符型;

       

              变量引用:${VAR_NAME}

              引号:

                  弱引用:" " //可以实现变量的替换

                  强引用:' ' //不可完成变量替换

                  命令引用: ` `

      3.

              声明某变量为整型变量:

                  let VAR_NAME=VALUE

                  declare -i VAR_NAME=VALUE

      如:在脚本想声明 变量sum为整型,并且给其赋值为0

                       declare -i sum=0

       

              声明某变量为环境变量:

                  export VAR_NAME=VALUE

                  declare -x VAR_NAME=VALUE

      如:

                  export -i sum=0

      4. 脚本的编写格式:

          第一行:写明解释器; #!/bin/bash

          注释行:所有以#开头的行均为注释行;会被解释器忽略;

       

          执行脚本:

              赋予执行权限;指明路径执行;

              直接传递脚本给bash解释器

       

              bash的选项:

                  -n: 测试脚本中是否有语法 错误;

                  -x: 调试执行;

      5 . 算术运算:

              $[EXPRESSION]

              let VAR_NAME=EXPRESSION

              $((EXPRESSION))

              $(expr argu1 argu2 argu3)

          5.1 例 a=1,b=2 求 a+b?

       

          第一种方法:

              [root@localhost ~]# a=1

      [root@localhost ~]# b=2

      [root@localhost ~]# echo $[a+b]

      3

            第二种方法:let 命令的用法

                        格式:

                        let 赋值表达式

                    【注】let 赋值表达式功能等同于:((赋值表达式))

                5.2    范例 1:给自变量 I 加5

                            [changsheng@localhost ~]$ i=2

    [changsheng@localhost ~]$ let i=i+5

    [changsheng@localhost ~]$ echo $i

    7

    ==>去掉 let 定义

    [changsheng@localhost ~]$ i=i+5

    [changsheng@localhost ~]$ echo $i

    i+5

    提示: let i=i+5 等同于 ((i=1+5)),但后者效率更高

                5.3    范例2 :利用let计数监控web服务状态的小项目(如果看不懂,可以跳过去,这个只是提升题)

        #########################################################################

    # File Name: _server_monitor.sh

    # Author: changsheng

    # mail: 1210982521@qq.com

    # Created Time: Fri 05 Dec 2014 03:48:07 PM CST

    #########################################################################

    #!/bin/bash

    #监控服务状态

    ServerMonitor(){

        #服务状态监控

        timeout=10

        fails=0

        success=0

        while true

        do

        /usr/bin/wget --timeout=$timeout --tries-1 http://172.16.0.1/ -q -O /dev/null

            if [ $? -ne 0 ]

            then

                let fails=fails+1

                success=0

            else

                fails=0

                let success=1

            fi

            if [ $success -ge 1 ]

            then

                exit 0

            fi

            if [$fails -ge 2 ];then

                Critical=" TMS 应用服务出现故障,请紧急处理!! "

                echo $Critical | mutt -s " 服务 down " www.magedu.com

                exit

            fi

        done

     

    }

     

    6. 以空格为分割,打印1-10之间的数字:

            [root@localhost test-scripts]# seq -s " " 10

    1 2 3 4 5 6 7 8 9 10

    注解: -s 是指定分隔符

    7. shell 的特殊变量

        如下图所示:

            

     

     

            7.1 $* 和$@区别例子:

                     $* 将所有的命令行的所有参数视为单个字符串,等同于"$1$2$3

                 $@ 将命令行的每个参数视为单独的子串,等同于"$1" "$2" " $3".这是将参数传递给其它程序的最佳方式,因为他会保留所有内嵌在每个参数的任何空白。

    实战演示:

    [root@localhost test-scripts]# set -- "I am" handsome boy #===》传入三个参数

    [root@localhost test-scripts]# echo $# #==è现在有三个参数

    3

    [root@localhost test-scripts]# for i in $*;do echo $i;done #循环打印这些参数用$*,无引号

    I

    am

    handsome

    boy

    [root@localhost test-scripts]# for i in $@;do echo $i;done #没有引号的情况下和$*结果一样

    I

    am

    handsome

    boy

    [root@localhost test-scripts]# for i ;do echo $i;done #--无in变量列表,相当于 in "$@"

    I am

    handsome

    boy

    [root@localhost test-scripts]# for i in "$@";do echo $i;done #------在有双引号的情况下,参数里引号内内容当做是一个参数输出了,这才是符合我们传入参数的要求set – "I am" handsome boy .

    I am

    handsome

    boy

    [root@localhost test-scripts]# for i in "$*";do echo $i;done #--加了双引号,$*表示一个字符串

    I am handsome boy

    [root@localhost test-scripts]# shift #---用shift 去掉第一个参数

    [root@localhost test-scripts]# echo $#

    2

    [root@localhost test-scripts]# for i in "$@";do echo $i;done #--再次打印只剩后面的参数

    handsome

    boy

     

    8.变量子串的常用操作

        我来为朋友们举例说明:

    定义changsheng变量,内容为"I am chang sheng "

    [root@localhost etc]# changsheng="I am chang sheng"

    [root@localhost etc]# echo ${changsheng}

    I am chang sheng    

    1. 返回字符串changsheng变量字符串的长度

    [root@localhost ~]# echo ${#changsheng}

    16

     

    2)截取changsheng变量字符串从第二个字符之后开始取,默认取后面字符的全部,第2个字符不包括在内。        也可以理解为删除前面的多少字符

    [root@localhost ~]# echo ${changsheng:2}

    Am  chang sheng

     

     

    3)截取changsheng变量字符从第二个字符之后,取两个字符。

    [root@localhost ~]# echo ${changsheng:2:2}

    am

    提示:类似 cut –c 参数

    [root@localhost ~]# echo ${changsheng}|cut -c 1-4

    I am

    [root@localhost ~]# echo ${changsheng}|cut -c 3-4

    am

     

     

    4)从变量$changsheng开头开始删除最短匹配"I am " 子串

    [root@localhost ~]# echo ${changsheng#I am}

    Chang sheng

     

     

    5)从变量$changsheng开头开始删除最长匹配"I am chang子串"

    [root@localhost ~]# echo ${changsheng##I am chang}

     Sheng

    6)        ${var%word*}: 自右而左,删除第一次word出现处的字符开始直到尾部的所有字符;

                ${var%%word*}:自右而左,删除最后一次word出现处的字符开始直到尾部的所有字符;

     

    系统脚本里的实例:

    [ -z "${COLUMNS:-}" ] && COLUMNS=80

       

    [ -z "${CONSOLETYPE:-}" ] && CONSOLETYPE="$(/sbin/consoletype)"

     

     

    下面依次举例说明:

    (1)${value:-world}

    当变量未定义或者为空时,返回world内容,否则返回变量的值

    [root@localhost ~]# result=${test:-UNSET}

    [root@localhost ~]# echo $result

    UNSET

    [root@localhost ~]# echo $test

    [root@localhost ~]#

    结论:当test变量没有内容时,就返回了后面的UNSET。但是并没有给 result 赋值

    (2)${value:=word}

    [root@localhost ~]# unset result

    [root@localhost ~]# echo $result

     

     

    [root@localhost ~]# unset test

    [root@localhost ~]# echo $test

     

    [root@localhost ~]# result=${test:=UNSET}

    [root@localhost ~]# echo $result

    UNSET

    [root@localhost ~]# echo $test

    UNSET

     

    提示:变量不存在时,会给变量赋值后面的内容

     

     

    9.变量替换表

    13. 常用文件测试操作

     

    整数二元比较操作符

     

     

     

     

     

     

    多分支结构

     

     

     

     

     

     

     

     

     

    函数:

     

  • 相关阅读:
    全基因组关联分析学习资料(GWAS tutorial)
    GWAS研究可利用的数据库(20200424更新)
    本周最新文献速递20200614
    本周最新文献速递20200607
    甲基化数据QC: 使用甲基化数据推测SNP基因型(ewastools工具)
    文献速递20200531
    查找感兴趣的基因、基因组区域是否有调控元件的在线网页工具EpiRegio
    许嵩
    甲基化数据QC:使用甲基化数据计算样本间的相关性
    there is no package called 'GO.db'报错解决方案
  • 原文地址:https://www.cnblogs.com/na2po2lun/p/4149236.html
Copyright © 2011-2022 走看看