2018-10-25 直播课堂笔记

1.shell 编程思想

编程思想

shell编程遵从UNIX哲学:把复杂问题分解成简单的小问题,然后再把各个部分功能组合起来解决复杂问题。

为什么要用shell
对于我们自己,学习shell是为了自动化,而自动化则是为了提高工作效率,提高产出,更进一步则是提高公司的收入 。

Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具,Linux/UNIX系统的底层及基础应用软件的核心大都涉及Shell脚本的内容。每一个合格的Linux系统管理员或运维工程师,都需要能够熟练地编写Shell脚本语言,并能够阅读系统及各类软件附带的Shell脚本内容。只有这样才能提升运维人员的工作效率,适应日益复杂的工作环境,减少不必要的重复工作,从而为个人的职场发展奠定较好的基础。

目前Linux系统下最流行的运维自动化语言就是shell和Python了。

两者之间,shell几乎是IT企业必须使用的运维自动化编程语言,特别是在运维工作中的服务监控、业务快速部署、服务启动停止、数据备份及处理、日制分析等环节里,shell是不可缺的。当然Python也是一门更适合处理复杂的业务逻辑,以及开发复杂的运维软件工具,实现通过web访问等。Shell是一个命令解释器,解释执行用户所输入的命令和程序。一输入命令,就立即回应的交互的对话方式。
 

2.字符串比较

2.1 字符串判断

str1 = str2 当两个串有相同内容、长度时为真
str1 != str2 当串str1和str2不等时为真
-n str1 当串的长度大于0时为真(串非空) 
-z str1 当串的长度为0时为真(空串) 
str1  当串str1为非空时为真

2.2 数字的判断

int1 -eq int2 两数相等为真 
int1 -ne int2 两数不等为真 
int1 -gt int2 int1大于int2为真 
int1 -ge int2 int1大于等于int2为真 
int1 -lt int2  int1小于int2为真 
int1 -le int2  int1小于等于int2为真

2.3 复杂逻辑判断

-a     与 
-o 或 
! 

2.4  =~正则比较

str="hello"
if [[ "$str" =~ ^he.* ]]; then
    echo "yes"
fi
使用正则匹配字符串的开头字符需要注意:

he*:不要使用he*,这里的*号表示e字符0到多个,即h,以及heeee都是测试通过的
he.*:这里只允许包含he的字符串通过测试
^he.*:这个表示是以he开头的字符串通过检测

2.5  ==比较

使用bash检查字符串是否以某些字符开头可以使用==比较

[[ $str == h* ]]
示例

str="hello"
if [[ $str == h* ]];
then
 echo 'yes'
fi
有两个地方需要注意:

h*不需要使用引号括起来,使用引号括起来是直接做相等比较
比较语句使用双中括号括起来,而不是使用单中括号

3. shell中select的用法

select命令:用于创建菜单,按数字顺序排列菜单项并将列表显示在标准输出上面,并提示用户输入,使用便利PS3指定提示语。

select命令是一个循环命令,需要使用break退出循环,或使用exit退出脚本程序。

select命令格式:
select 变量 in 列表
do
    命令
done
select命令实例:

PS3变量被赋值为提示语句,出现在菜单选项下面,select循环由program变量和显示在菜单上的列表(ls -F,pwd和date)组成,

用户在菜单中选择数字后,就相当于执行了括号右边的命令,select循环会一直执行,直到用户按下ctrl+c退出。

#! /bin/bash
PS3="select a program to execute:"
select program in 'ls -F'  pwd  date
do

   $program
break      加上break为程序执行完一次即退出
done


select循环语句由如下特点:

select语句使用Bash内部变量PS3的值作为它的提示符信息。

打印到屏幕上的列表LIST中的每一项都会加上一个数字编号。

当用户输入的数字和某一个数字编号一致时,列表中响应的项即被赋予变量VAR。

如果用户输入为空,将重新显示列表LIST中的项和提示符信息。

可以通过添加一个退出选项,或者Ctrl+C、Ctrl+D组合键退出select循环

4. shell中的while循环

while 循环是不定循环,也称作条件循环,主要是指循环可以一直进行,直到用户设定的条件达成为止,这就和 for 的固定循环不太一样了。

while read 可以处理有空格的行。

while循环语法如下:

while [条件判断式]
do
程序
done

while read line有2个不同的方式读取文件:

以命令行结果作为输入:

cat /tmp/table.list|while read line; do

   echo $line

done

直接以文件作为输入:

while read line; do

   echo $line

done</tmp/table.list

脚本是从IBM AIX(KSH)系统中移植过来的,目的是要对DB2数据库中表和索引进行维护。原来的脚本使用的是第1种方式,在IBM AIX下运行是没有问题的。移植到SUSE LINUX(BASH)系统后,发现第1种方式在循环体中运行DB2语句会报找不到数据库连接,需要在循环体中重新重新连接数据库才可以。后来换成第2种方式,就不需要在循环体中重新连接了。

对 while 循环来讲,只要条件判断式成立,循环就会一直进行,直到条件判断式不成立,循环才会停止。

实例:每秒检测系统负载,标准输出

#!/bin/bash
#checking the load of the machine

while true
do
    uptime
    sleep 1
done

5. shell 与 空格

shell脚本中,不能随意添加空格,否则出错:

1,=等号两边必须无空格。否则出错。如i =$1和i= $1都是错的。但是在()内部不限制如for ((i= 1;i < 3;i= i+1))是正确的。

2,(())内外部括号之间无空格,( () )这样报错。但内部括号内不限制,随便如s=$(( $i+1 ))可以

3,[]是条件判断式,所以前后内部都必须空格。其内部元素之间必须有空格才能识别,否则一律报错,如“while [ $i -lt 6 ]”少一个空格都报错。总之,[]所在行每个独立元素前后都必须有空格(不是一起的就必须空格)。-gt,-lt,-ge,-le,-ne

另外,单引号是字符串限定符,将内部内容作为字符串。而双引号和{}是变量限定符,内部作为变量处理

猜你喜欢

转载自blog.csdn.net/a1779078902/article/details/83414205
今日推荐