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. 常用文件测试操作

 

整数二元比较操作符

 

 

 

 

 

 

多分支结构

 

 

 

 

 

 

 

 

 

函数:

 

bash脚本编程知识储备的更多相关文章

  1. 脚本命令高级Bash脚本编程指南(31):数学计算命令

    题记:写这篇博客要主是加深自己对脚本命令的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 高等Bash脚本编程指南(31):数学盘算命令 成于坚持,败于止步 操作数字 factor ...

  2. 高级Bash脚本编程指南(27):文本处理命令(三)

    高级Bash脚本编程指南(27):文本处理命令(三) 成于坚持,败于止步 处理文本和文本文件的命令 tr 字符转换过滤器. 必须使用引用或中括号, 这样做才是合理的. 引用可以阻止shell重新解释出 ...

  3. 高级Bash脚本编程指南《Advanced Bash-Scripting Guide》 in Chinese

    <Advanced Bash-Scripting Guide> in Chinese <高级Bash脚本编程指南>Revision 10中文版 在线阅读链接:http://ww ...

  4. 高级bash脚本编程(三)

    高级bash脚本编程 知识点 compound 和 comparison -a 逻辑与 exp1 -a exp2 如果表达式 exp1 和 exp2 都为真的话,那么结果为真. -o 逻辑或 exp1 ...

  5. 高级Bash脚本编程(二)

    高级Bash脚本编程(二) 退出 退出状态码 退出:exit 被用来结束一个脚本,它也返回一个值,并且这个值会传递给脚本的父进程,父进程会使用这个值做下一步的处理. 每个命令都会返回一个退出状态码,成 ...

  6. 高级Bash脚本编程(一)

    高级Bash脚本编程 Bash 它是能力很强的计算机语言,被称为解释性语言或脚本语言,它可以调用所有的UNIX命令和工具再加上公共程序. Bash中的特殊字符 注释(#) (除#!外,#!是用于指定当 ...

  7. Bash脚本编程总结

    bash脚本编程之用户交互: read [option]… [name …]  -p ‘PROMPT’  -t TIMEOUT bash -n /path/to/some_script  检测脚本中的 ...

  8. Bash脚本编程之算术运算

    简介 Bash所支持的算术运算和C语言是一样的,这里指的是操作符(operator)以及它们的优先级(precedence).结合性(associativity)和值,详见Shell Arithmet ...

  9. Bash脚本编程之字符串处理

    简介 其实这里说得字符串处理,对应的是bash官网中的[Shell Parameter Expansion],不过直接去看这部分内容实在是太难以理解了.就按照马哥所说的字符串处理会比较好理解,平常使用 ...

随机推荐

  1. RBF网络——核心思想:把向量从低维m映射到高维P,低维线性不可分的情况到高维就线性可分了

      RBF网络能够逼近任意的非线性函数,可以处理系统内的难以解析的规律性,具有良好的泛化能力,并有很快的学习收敛速度,已成功应用于非线性函数逼近.时间序列分析.数据分类.模式识别.信息处理.图像处理. ...

  2. Dungeon Master hdoj

    Dungeon Master Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Tot ...

  3. Java IO-InputStream家族 -装饰者模式

    最近看到一篇文章,初步介绍java.io.InputStream,写的非常通俗易懂,在这里我完全粘贴下来. 来源于 https://mp.weixin.qq.com/s/hDJs6iG_YPww7ye ...

  4. 关于打包压缩几种格式(gzip,bzip2,xz)的试验对比

    要通过脚本进行备份,必然将会应用到压缩技术,这里简单针对几个常见的格式进行测验,从而得到一种合适的方式. 这里以一个应用目录做例子: [root@isj-test-5 mnt]$du -sh * 66 ...

  5. SwiftUI 官方教程(五)

    SwiftUI官方教程(五) 5. 同时使用 UIKit 和 SwiftUI 至此,我们已准备好创建 map view 了,接下来使用 MapKit 中的 MKMapView 类来渲染地图. 在 Sw ...

  6. MAVEN 杂记

    MAVEN中央仓库 http://repo.maven.apache.org/maven2http://repo1.maven.org/maven2/http://mvnrepository.com/ ...

  7. ASP.NET MVC4入门到精通系列目录汇总(转)

    序言 最近公司在招.NET程序员,我发现好多来公司面试的.NET程序员居然都没有 ASP.NET MVC项目经验,其中包括一些工作4.5年了,甚至8年10年的,许多人给我的感觉是:工作了4.5年,We ...

  8. BZOJ1010: [HNOI2008]玩具装箱toy(dp+斜率优化)

    Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 12451  Solved: 5407[Submit][Status][Discuss] Descript ...

  9. Charles设置抓取https请求

    1.在手机上设置HTTP代理,将手机与电脑连接. 打开手机设置-WLAN,设置代理 2.(iPhone)使用iPhone自带的浏览器打开Safari,并输入地址:http://charlesproxy ...

  10. 【Oracle】手工建库启动到nomount状态时错误ORA-09925,ORA-01017

    配置好pfile和口令文件后启动数据库到nomount状态下出现错误: [oracle@localhost ~]$ sqlplus / as sysdba SQL*Plus: Release 11.2 ...