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
另外,单引号是字符串限定符,将内部内容作为字符串。而双引号和{}是变量限定符,内部作为变量处理