bash脚本编程(与面向过程相似)

一、基础知识

1、程序:语句和表达式

      顺序执行

      选择执行

      循环执行

2、 程序 = 指令 + 数据

    面向过程编程  :以指令为中心组织数据

    面向对象编程  :以数据为中心组织指令

3、程序的执行模型 :

(以C语言编程为例)编译执行:源代码—》预处理—》编译—》汇编—》链接(通过编译器)—》运行

  (bash脚本编程) 解释执行:源码  —》(解释器)—》 运行 

bash脚本的解释器bash

bash脚本一般以.sh结尾,例如vim test1.sh

脚本的第一行:shebang(指定解释器)即为#!/bin/bash,#前永远不能出现空格空行。

4、变量:命名的内存空间(按变量名提取内存中的变量值/数据值)

数据类型

(1)定义了数据存储格式

(2)数据的表示范围

(3)可以参与的运算类型不一样

数据按强弱来分,分为

  强类型:对数据严格要求,如C语言中对数据类型要求就是强类型。

  弱类型:bash把所有值都默认当作字符,所以bash脚本编程就是弱类型。

数据按格式来分,分为 

(1)数值型:

精确数值型:整数

近似数值型:float(单精度)  double(双精度)   浮点型

(2)字符型

(3)布尔型:(用于脚本的选择判断)

     true  1         false  0

     逻辑与运算:  &&    a  &&  b    全真才为真

     逻辑或运算:  ||    a  ||  b    全假才为假

     逻辑非运算:  !    !a         取反的运算

二、bash变量类型

1、本地变量:只对当前shell进程有效,对当前shell进程之外的shell进程无效(例:本地变量对父shell进程  和子shell进程无效)。

2、 环境变量:对当前shell进程及其子shell进程有效。

 env/printenv    显示当前shell中的所用环境变量

wKiom1UqYNTx7sVRAAEmhXinmf0974.jpg

export创建/修改环境变量

例:创建一个openstack环境变量

wKiom1UqYb2j968aAAB3rs0Ojzs067.jpg

3、局部变量:仅对某一段代码空间有效的变量,通常用于脚本函数

4、位置变量:$1  $2,...

5、特殊变量:$?  $0  $#  $$  $*  $@  

变量的引用

标准引用: ${变量名} 例:$SHELL(${SHELL})

强引用:‘root shell  is   $SHELL’

wKiom1UqZBaD-ROTAABZrEROCCc190.jpg 

强引用会原样输出。

弱引用:“root shell  is   $SHELL”

wKiom1UqZEjR5eXmAABnH0y3oxQ461.jpg

弱引用显示环境变量的值。

三、变量的命名规则 

  1、不能用程序中的关键字:if  elif  fi  then  for  ....

  2、只能使用数字、字母或下划线,且不能以数字开头

  3、尽量做到见名知意

四、文件查看及处理工具

之前学过的文件相关命令cat  less  more tail head touch  stat  cp  rm  mv

1、wc   [选项]  文件名  

          -l      统计文件行数  

          -c      统计文件字符数

          -w      统计文件单词数

例:分别统计/etc/passwd文件的行数,字符数,单词数结果如下

wKioL1UqZwSCDhbAAADebZOe5Us042.jpg

2、cut(按分隔符)截取文件内容

cut  [选项]  文件名

       -d  分隔符           指定按什么分隔符截取文件内容 (不指定默认的分割符就是空格)

       -f  #/#-#/#,#..     指定要显示的字段(#代表数字)

例:显示/etc/passwd文件最后一行的用户的UID

wKiom1UqZ3qzmlE0AACTmDP2OAo522.jpg

3、sort  [选项]  文件名

           -n          按数值大小排序

           -r          逆序排序

           -f          忽略字符大小写

           -t 分隔符   指定分隔符

           -k #        按第#个字段进行排序  

           -u          去重选项

在/tmp下新建一个sort文件,内容如下

wKioL1Uqagizc1aFAABXB9fmo8s010.jpg

wKiom1UqaYTCpz6YAADFAnEATu4351.jpg

注:-r逆序排序指的是按首个数字进行的排序,若想按数值大小排序,应按如下操作

wKioL1Uqa7GhE92IAABfCSYmr5o393.jpg

去掉/tmp/sort文件中重复的内容,如下

wKiom1Uqa8DjUuSbAABQCZDti-8589.jpg

将/etc/passwd文件中的用户信息,按UID的数值大小进行排序,如下

wKiom1UqazeAbYpTAAIjNT9YzR4313.jpg

4、uniq(统计命令统计)每一行出现的次数

   uniq  [选项]  文件

           -c   统计每行出现的次数

           -d   仅显示重复的行

           -u   仅显示不重复的行

wKiom1UqbGDAm3YEAABeCLNwnNs531.jpg

注:uniq  统计中的重复指的是相邻行的重复。

wKioL1UqblbgIF67AACLxX_-_wY770.jpg

练习:只ifconfig的ip地址

wKioL1Uqb6TCqAThAAB32aOcjaY469.jpg

练习1:编写一个脚本

(1)创建一个目录/tmp/testdir

 (2) 复制/etc/fstab,/etc/rc.d/rc.sysinit 到/tem/testdir下

  vim /tmp/testdir.sh

  #!/bin/bash

  mkdir  /tmp/testdir

  cp  /etc/fstab /etc/rc.d/rc.sysinit  /tmp/testdir

通过bash -x 文件名查看脚本运行情况。

练习2:编写一个脚本

(1)显示当期系统上GID最大的5个组和其GID号;要求逆序显示

(2)显示/etc/passwd文件的行数

   vim /tmp/gid.sh

   #!/bin/bash

   cut -d : -f 1,3  /etc/group  |sort -t : -k 2 -n -r |head -5

   wc -l /etc/passwd |cut -d" " -f 1

通过bash -x 文件名查看脚本运行情况。

五、bash的配置文件

1、profile类:为交互式登陆的shell进程提供配置。

对所有用户有效的配置文件即全局有效: /etc/profile

                                     /etc/profile.d/*.sh

仅对当前用户有效的配置文件即用户个人有效:~/bash_profile

profile类配置文件的功用:

(1)用以定义环境变量

(2)运行命令或脚本

2、bashrc类:为非交互式登陆的shell进程提供配置。

全局有效:/etc/bashrc

个人用户有效:~/.bashrc

bashrc类配置文件的功用:

(1)定义本地变量

(2)定义命令别名

如何使修改后的bash配置文件重新生效:

source源文件    .配置文件

配置文件生效的优先级:

交互式登陆:/etc/profile->/etc/profile.d/*.sh->~/bash_profile->~/.bashrc->/etc/bashrc所以定义此文件可以使其他文件全都生效。

非交互式登陆:~/.bashrc->/etc/bashrc->/etc/profile.d/*.sh