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?

    ?

    ????第一种方法:

    ????????[[email protected] ~]# a=1

    [[email protected] ~]# b=2

    [[email protected] ~]# echo $[a+b]

    3

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

????????????????????格式:

????????????????????let 赋值表达式

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

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

????????????????????????[[email protected] ~]$ i=2

[[email protected] ~]$ let i=i+5

[[email protected] ~]$ echo $i

7

==>去掉 let 定义

[[email protected] ~]$ i=i+5

[[email protected] ~]$ echo $i

i+5

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

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

????#########################################################################

# File Name: _server_monitor.sh

# Author: changsheng

# mail: [email protected]

# 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之间的数字:

????????[[email protected] test-scripts]# seq -s " " 10

1 2 3 4 5 6 7 8 9 10

注解: -s 是指定分隔符

7. shell 的特殊变量

????如下图所示:

????????

?

?

????????7.1 $* 和[email protected]区别例子:

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

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

实战演示:

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

[[email protected] test-scripts]# echo $# #==è现在有三个参数

3

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

I

am

handsome

boy

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

I

am

handsome

boy

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

I am

handsome

boy

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

I am

handsome

boy

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

I am handsome boy

[[email protected] test-scripts]# shift #---用shift 去掉第一个参数

[[email protected] test-scripts]# echo $#

2

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

handsome

boy

?

8.变量子串的常用操作



????我来为朋友们举例说明:

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

[[email protected] etc]# changsheng="I am chang sheng"

[[email protected] etc]# echo ${changsheng}

I am chang sheng????

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

[[email protected] ~]# echo ${#changsheng}

16

?

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

[[email protected] ~]# echo ${changsheng:2}

Am  chang sheng

?

?

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

[[email protected] ~]# echo ${changsheng:2:2}

am

提示:类似 cut –c 参数

[[email protected] ~]# echo ${changsheng}|cut -c 1-4

I am

[[email protected] ~]# echo ${changsheng}|cut -c 3-4

am

?

?

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

[[email protected] ~]# echo ${changsheng#I am}

Chang sheng

?

?

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

[[email protected] ~]# 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内容,否则返回变量的值

[[email protected] ~]# result=${test:-UNSET}

[[email protected] ~]# echo $result

UNSET

[[email protected] ~]# echo $test

[[email protected] ~]#

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

(2)${value:=word}

[[email protected] ~]# unset result

[[email protected] ~]# echo $result

?

?

[[email protected] ~]# unset test

[[email protected] ~]# echo $test

?

[[email protected] ~]# result=${test:=UNSET}

[[email protected] ~]# echo $result

UNSET

[[email protected] ~]# echo $test

UNSET

?

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

?

?

9.变量替换表

13. 常用文件测试操作

?

整数二元比较操作符

?

?

?

?

?

?

多分支结构

?

?

?

?

?

?

?

?

?

函数:

?

时间: 2024-10-13 01:42:44

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

bash脚本编程详细剖析

bash脚本编程详细剖析          背景:bash脚本编程是Linux学习一个至关重要的部分,想完成一个脚本可能很简单:但是想让自己的脚本写的让人觉得心旷神怡实为不简单.bash是所有Linux发行版的几乎都有的,因此我们这里以bash脚本为例,讨论bash脚本的编写方法.对于bash脚本编程中一些比较重要的知识点,我这里也会给予案例演示. 一.脚本编程中前话: 我们都知道,bash脚本编程说白了就是命令的堆积.只不过这种堆积的方式不是杂乱无章的堆积,而是按照一定要求和格式的链接.这说明

bash脚本编程入门

bash脚本编程(与面向过程相似) 一.基础知识 1.程序:语句和表达式 顺序执行 选择执行 循环执行 2. 程序 = 指令 + 数据 面向过程编程  :以指令为中心组织数据 面向对象编程  :以数据为中心组织指令 3.程序的执行模型 : (以C语言编程为例)编译执行:源代码->预处理->编译->汇编->链接(通过编译器)->运行 (bash脚本编程) 解释执行:源码  ->(解释器)-> 运行 bash脚本的解释器bash bash脚本一般以.sh结尾,例如vi

Linux命令:bash脚本编程

bash脚本编程简介: 此文假定你没有任何关于脚本或一般程序的编程知识, 但是如果你具备相关的知识, 那么你将很容易就能够达到中高级的水平. . . 你可以把此文作为参考, 自学手册, 或者是关于shell脚本技术的文档. 介绍内容包括: A:变量.变量类型 B:条件判断 C:算术运算 D: E: F: G: A.bash变量类型: 1)本地变量:(局部变量) set VARNAME=VALUE: 作用域为整个bash进程: 2)局部变量: local VARNAME=VALUE:作用域为当前代

高级Bash脚本编程指南

http://tldp.org/LDP/abs/html/ 高级Bash脚本编程指南对脚本语言艺术的深入探索 本教程不承担以前的脚本或编程知识,但进展迅速走向一个中级/高级水平的指令...一直偷偷在细小的UNIX®智慧和学识.它作为一本教科书,一本手册,自学,并作为一个参考和知识的来源,壳牌的脚本技术.练习和大量的评论实例请读者参与,在这样的前提下,真正学习脚本的唯一途径是编写脚本.这本书是适合课堂使用的一般介绍编程的概念.本文件被授予公共领域.没有版权! 奉献对于安妮塔,所有魔术的来源内容表第

bash脚本编程之条件判断、条件测试

脚本编程: 编程面向过程有如下几种执行方式 顺序执行 选择执行:  如 if, case 循环执行:  如 for, while, until bash的变量类型: 本地变量 set VAR_NAME=value 设置变量赋值 如: set User=Centos unset VAR_NAME 撤消变量赋值 如: unset User=Centos ${VAR_NAME} 作用范围:当前shell进程: 局部变量 local VAR_NAME=value 设置变量赋值 unset VAR_NAM

bash脚本编程之变量、变量类型、条件测试、算术运算、及特殊变量

一.学习目的 1.了解bash脚本的变量类型及变量的使用 2.了解bash中条件测试的种类及如何在bash中实现条件的判断 3.学会在bash中做算术运算 4.了解特殊变量的使用 二.学习内容 1). ①.bash的变量类型: 环境变量 .本地变量.局部变量.位置变量.特殊变量 环境变量: export VALUENAME = VALUE 作用领域是当前的shell进程及其子进程 本地变量: VALUENAME= VALUE 作用领域为整个bash的进程 局部变量:local VALUENAME

《高级Bash脚本编程指南》十年来首次修订

新年伊始,开源慕课的知识库上线了.初期提供了<Linux命令大全/Bash 参考><高级Bash脚本编程指南>两个系列.其他资料正将陆续上线. 其中,<高级Bash脚本编程指南>对于Shell学习者来说,是一本神一样的书籍. 它的原作者是Mendel Cooper,英文名叫<Advanced Bash-Scripting Guide>发表在http://tldp.org/ 上,是一本免费的书籍. 有人说,学习Unix/Linux,有座山叫shell编程,你总

bash脚本编程之用户交互

bash脚本编程之用户交互: read [option]... [name ...] -p 'PROMPT'    读取输入的内容 -t TIMEOUT    超时时间,如果超过了该时间,继续执行下面代码 bash -n /path/to/some_script 检测脚本中的语法错误 bash -x /path/to/some_script 调试执行 示例: 输入一个磁盘文件信息,使用fdisk -l显示该磁盘信息 #!/bin/bash read -p "Enter a disk specia

bash脚本编程for

bash脚本编程:        if语句.bash -n.bash -x CONDITION:            bash命令:                用命令的执行状态结果:                    成功:true                    失败:flase 成功或失败的意义:取决于用到的命令: 单分支:            if CONDITION; then                if-true            fi 双分支: