目录
第 1 章 初始bash shell脚本
1.1 什么是shell
1.2 shell与shell脚本关系
1.3 shell脚本使用场景
第 2 章 bash shell脚本学习环境准备与练习
2.1 实验环境
2.2 vim编辑器设置
2.3shell脚本热身分析
总结
第 1 章 初始bash shell脚本
基础Linux shell就如翻译者一般,而由众多shell命令堆积出的shell脚本可以实现自动化运维从而大大提高工作效率,因此shell在linux运维中一项必不可少的技术。本章将会初始bash shell
注意:没有完美的程序语言只有适合的程序语言。
1.1什么是shell?
1)shell是由C语言编写的应用程序,是用户和操作系统交互时的一座桥梁。
2)shell提供了一种界面和接口可以访问操作内核
3)shell既是命令语言 也是程序设计语言
1.2 shell与shell脚本关系
shell脚本是由shell编写的一种脚程序
1.3 shell脚本场景分析:
shell脚本适用于系统管理等一些场景
shell 不适用于以下场景:
1)资源密集型的任务,尤其在需要考虑效率时(比如,排序,hash等等)
2)需要处理大任务的数学操作,尤其是浮点运算,精确运算,或者复杂的算术运算(这种情况一般使用C++或FORTRAN来处理)
3)有跨平台移植需求(一般使用C或Java)
4)复杂的应用,在必须使用结构化编程的时候(需要变量的类型检查,函数原型等等)
·············
本章以思维导图方式呈现:
第 2 章 环境准备
要学一门语言首先要有对应的环境,本章讲述shell脚本学习的环境准备和一些脚本举例。
2.1实验环境
1)在vmware16上创建一台最小化安装的centos7.9
centos7.9镜像地址http://mirrors.aliyun.com/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso
2)xshell7远程连接软件
2.2 vim编辑器设置
1)设置高亮 (centos7默认为高亮可忽略)
2)自动显示行号
设置方法:vim /etc/vimrc 在最后行添加set number
2.3脚本热身练习
脚本目的:清除日志文件
分析三个脚本体会脚本不断完善的过程
脚本(1)
#!/bin/bash
#清除日志文件
#以root身份运行
cd /var/log
cat /dev/null > messages
cat /dev/null > wtmp
echo "Logs cleaned up."
问题分析:
1.这两个日志文件是做什么的?
2.wtmp这个文件名,是什么意思?
3.为什么用cat/dev/nul1>来清除日志?
4.如果不是root用户执行这个脚本,如何控制错误信息?
解答:
1.系统的日志文件通常记录内核的消息、一些服务的公共信息、报错信息,通常可以查看日志来判断系统的运行情况
2./var/log/wtmp 二进制文件 其中记录每个用户登录成功的信息(btmp是失败的消息)
last输出为wtmp中内容
3.保证文件权限、属性不变,降低风险
脚本(2)
说明:对(1)脚本的完善 在其中设置变量(变量:被赋值的字符串、执行实际数据的指针)达到了在不通环境下简单配置脚本变量使其适合当前环境的目的。
#!/bin/bash
#清除日志文件
#以root身份运行
#以后,在这个地方增加一个逻辑
# 如果不是root用户执行脚本提示错误信息 然后退出
#如果使用变量,这样更加灵活,优雅
LOG_DIR=/var/log
cd $LOG_DIR
cat /dev/null > messages
cat /dev/null > wtmp
echo "Logs cleaned up."
exit #这个命令是一种正确,合适的退出办法。
#不带任何参数的exit,将返回退出的状态码。
脚本(3)对脚本(2)的完善利用了判断语句使脚本具有一定分析问题的能力
(关于其中一些语句格式和概念日后会继续更新,在此只做了解即可)
#!/bin/bash
#清除日志文件
#说明:这个脚本脚本更新了许多新的特性
LOG_DIR=/var/log
#定义环境变量
ROOT_UID=0 #$UID=0时,用户都有root的权限
LINES=50 #默认保存的行数
#定义退出代码
E_XCD=66 #退出代码:表示不能修改目录位置
E_NOROOT=67 #退出代码:表示不是root用户
#判断是否是以root用户身份来运行脚本
if [ "$UID" -ne "$ROOT_UID" ]
then
echo "Must be root to run this script."
exit $E_NOROOT
fi
#测试这个脚本是否传递有参数(非空)
#保存messages日志最后50条
if [ -n "$1" ]
then
lines=$1
else
lines=$LINES #如果没有在命令指定,就使用默认值
fi
cd $LOG_DIR
#处理日志文件前,判断是否在/var/log目录中
#检查cd操作
if [ pwd != "$LOG_DIR" ] #或 if [ "$PWD" != "$LOG_DIR" ]
then
echo "Can't change $LOG_DIR."
exit $E_XCD
fi
#保留messages最后部分而不是全部清楚
tail -$lines messages > mesg.tmp
mv mesg.tmp messages
#旧的办法不在需要了,新的办法更加安全吗?
#cat /dev/null > messages
cat /dev/null > wtmp
echo "Logs cleaned up."
exit 0
#退出时返回0,0表示成功
脚本(3)分析(针对shell脚本中三个判断语句作用分析)
【判断1】
if [ "$UID" -ne "$ROOT_UID" ] 中-ne是关系运算符,检查前后两个操作数的值是否相等,如果不等为真。
【判断2】
if [ -n "$1" ]
then
lines=$1
else
lines=$LINES #如果没有在命令指定,就使用默认值
fi
其中-n是一个字符串运算符,检查后面给定的字符串的操作数长度是否为0,如果为0返回否,不为0返回真
即如果$1(特殊变量:保留系统功能,传递给脚本第一个参数)存在/传递的有参数,要保留的行数就为$1值
$0脚本名称
【判断3】
if [ pwd != "$LOG_DIR" ]
!= 表示不等
补充:
tail -$lines messages > mesg.tmp tail显示出的是一个全新的文件
本章以思维导图模式呈现如下:
总结:此两章初始shell脚本,通过练习的三个脚本分析,得到没有完美的计算机语言只有适合的语言,没有完美的脚本,脚本是一个在不断完善的过程。