Shell脚本介绍
今日目标
了解Shell脚本概念
磁盘相关命令回顾:
磁盘相关命令 | 说明 |
fdisk | 分msdos分区与要看系统硬盘与分区情况 |
lsblk | 查看块设备与其挂载情况 |
df -h | 查看已经挂载的文件系统情况 |
mount | 也是查看挂载的情况,还能看到挂载的参数(ro或rw等) |
iostat | 需要安装sysstat软件包,动态查看磁盘读写情况 |
parted | 高级分区命令,可以分msdos分区与gpt分区 |
free -m | 查看内存与swap |
编程语言分类介绍
计算机只能识别机器语言(如:01010101001这种), 程序员不能直接去写01这种代码,所以要程序员所编写的程序语言翻译成机器语言。将其他语言翻译成机器语言的工具,称之为==编译器或解释器==。
如:中国人 ---(翻译)----外国人
编译器翻译的方式有两种,一种是编译,一种是解释。区别如下:
编译型语言:
程序在执行之前需要一个专门的编译过程,把程序编译成为机器语言文件,运行时不需要重新翻译,直接使用编译的结果就行了。程序执行效率高,依赖编译器,跨平台性差些。如C、C++
解释型语言:
程序不需要编译,程序在运行时由==解释器==翻译成机器语言,每执行一次都要翻译一次。因此效率比较低。比如Python/JavaScript/ Perl /ruby/Shell等都是解释型语言。
总结:
编译型语言比解释型语言==速度较快==,但是不如解释型语言==跨平台性好==。如果做底层开发或者大型应用程序或者操作系开发一==般都用编译型语言==;如果是一些服务器脚本及一些辅助的接口,对速度要求不高、对各个平台的==兼容性有要求==的话则一般都用==解释型语言==。
shell介绍
总结:
==shell就是人机交互的一个桥梁==
shell的种类
# cat /etc/shells /bin/sh 是bash shell的一个快捷方式 /bin/bash bash shell是大多数Linux默认的shell,包含的功能几乎可以涵盖shell所有的功能 /sbin/nologin 表示非交互,不能登录操作系统 /bin/dash 小巧,高效,功能相比少一些
==/bin/bash或/bin/sh就是最常用的shell程序的解释器==
什么是shell脚本?
解释型语言的编程一般叫script编程,也就是脚本的意思。shell script就是shell脚本。
==若干命令 + 基本格式 + 特定语法 + 思想= shell脚本==
什么时候用到脚本?
重复化、复杂化的工作,通过把工作的命令写成脚本,以后仅仅需要执行脚本就能完成这些工作。
①自动化分析处理
②自动化备份
③自动化批量部署安装
④等等...
如何学习shell脚本?
尽可能熟悉更多的命令
掌握脚本的标准的格式(声明类型、使用标准的执行方式运行脚本)
熟悉掌握脚本的基本语法
多看(看懂)——>多模仿(多练)——>多思考
shell脚本
第一个shell脚本
[root@server ~]# mkdir /shell/shell01 -p [root@server ~]# vim /shell/shell01/1.sh #!/bin/bash 解释型语言声明类型,表示/bin/bash为解释器(用/bin/sh也可以) echo "hello world"
脚本执行方法:
方法1: (脚本不用执行权限,声明类型没有产生作用,因为是直接指定sh来执行此脚本)
[root@server ~]# cd /shell/shell01/ [root@server shell01]# sh 1.sh hello world 补充:sh -x 1.sh这样执行脚本有一定的排错功能,可以查看脚本执行过程
方法2:(脚本不用执行权限,声明类型没有产生作用,因为是直接指定bash来执行此脚本)
[root@server shell01]# bash 1.sh hello world
方法3: (脚本需要执行权限,声明类型产生作用)
[root@server shell01]# ./1.sh -bash: ./1.sh: Permission denied [root@server shell01]# chmod a+x 1.sh [root@server shell01]# ./1.sh hello world
纯命令shell脚本
也就是不需要学习任何其它的编程语法(但需要对命令掌握熟练),把要多个命令按照顺序从上往下排列。执行的时候会按从上往下的顺序来执行.
示例: 打印1,2,3
#!/bin/bash echo 1 echo 2 echo 3
示例: 删除其它的yum配置文件,配置本地yum(假设镜像挂载到/mnt目录)
#!/bin/bash rm /etc/yum.repos.d/* -rf cat > /etc/yum.repos.d/local.repo <<EOF [local] name=local baseurl=file:///mnt enabled=1 gpgcheck=0 EOF
回顾
#注意下面这两种区别 cat > /tmp/abc <<EOF # >符号,表示把原内容覆盖 你好 EOF cat >> /tmp/abc <<EOF # >>符号,表示在原内容上追加 哈哈 EOF
关键词: 编程代码 翻译(解释器/bin/bash或/bin/sh) 把多条命令按顺序写到程序里,可以帮我们一次性批量执行,提高效率。
练习: 用shell实现httpd访问日志每天轮转(/var/log/httpd/access_log)
要求:
将/var/log/httpd/access_log轮转到/backup/年/月/年-月-日期.access_log
轮转后再创建新的/var/log/httpd/access_log
每次日志轮转后,都在/var/log/message里记录一条日志已经轮转的信息(信息自定义)
将写好的脚本放到crond服务里执行
准备工作:
# yum install httpd httpd-devel elinks -y # /etc/init.d/httpd restart # elinks -dump 127.0.0.1 # cat /var/log/httpd/access_log 127.0.0.1 - - [12/Apr/2019:14:55:15 +0800] "GET / HTTP/1.1" 403 4961 "-" "ELinks/0.12pre5 (textmode; Linux; -)"
#!/bin/bash mkdir /backup/$(date +%Y)/$(date +%m)/ -p mv /var/log/httpd/access_log /backup/$(date +%Y)/$(date +%m)/$(date +%F).access_log touch /var/log/httpd/access_log /etc/init.d/httpd reload &> /dev/null logger -t "日志轮转" "$(date +%F)成功"