1.Shell编程入门
1.1 为什么要学习Shell编程?
1)Linux运维工程师在进行服务器集群管理时,需要编写Shell程序来进行服务器管理。 2)对于JavaEE和python程序员来说,工作的需要,你的老大会要求你编写一些Shell脚本进行程序或者服务器的维护,比如编写一个定时备份数据库的脚本 3)对于大数据程序员来说,需要编写Shell程序来管理集群
1.2 Shell是什么?
shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
1.3 Shell 脚本的执行方式
脚本格式要求 1)脚本以#!/bin/bash开头 2)脚本需要有可执行权限
1.3.1 编写第一个Shell脚本
需求说明 创建一个Shell脚本,输出hello world!
步骤1:vim myShell.sh
#!/bin/bash echo "Hello,world!"
1.3.2 脚本的常用执行方式
方式1(输入脚本的绝对路径或相对路径) 1)首先要赋予helloworld.sh脚本的+x权限 2)执行脚本 方式2(sh+脚本) 说明:不用赋予脚本+x权限,直接执行即可
步骤2:chmod 744 myShell.sh 给所有者一个x权限 相对路径执行:./myShell.sh 绝对路径执行:/root/shell/myShell.sh
直接执行 sh ./myShell.sh
1.4 Shell变量
Shell的变量的介绍 1)Linux Shell中的变量分为,系统变量和用户自定义变量。 2)系统变量:$HOME、$PWD、$SHELL、$USER等等 比如:echo $HOME等等
3)显示当前shell中所有变量:set
直接输入:set
Shell变量的定义 基本语法 1)定义变量:变量=值 2)撤销变量:unset 变量 3)声明静态变量:readonly 变量,注意:不能 unset
快速入门 案例1:定义变量A 案例2:撤销变量A
案例3:声明静态的变量 B=2,不能unset
案例4:可把变量提升为全局环境变量,可供其他shell程序使用
定义变量的规则 1)变量名称可以由字母/数字和下划线组成,但是不能以数字开头。 2)等号两侧不能有空格(重点) 3)变量名称一般习惯为大写 将命令的返回值赋给变量 1)A=`ls -la`反引号(1左边的那个按键),运行里面的命令,并把结果返回给变量A 2)A=$(ls -la)等价于反引号
以数字开头的变量
变量赋值的时候两边有空格
1)A=`ls -la`反引号(1左边的那个按键),运行里面的命令,并把结果返回给变量A
2)方式二
1.5 Shell环境变量
基本语法 1)export 变量名=变量值(功能描述,将shell变量输出为环境变量) 2)source 配置文件(功能描述:让修改后的配置信息立即生效) 3)echo $变量名 (功能描述:查询环境变量的值)
快速入门 1)在 /etc/profile文件中定义TOMCAT_HOME环境变量
2)查看环境变量TOMCAT_HOME的值
3)在另外一个shell程序中使用TOMCAT_HOME
注意:在输出TOMCAT_HOME 环境变量前,需要让其生效 source /etc/profile
1.6 位置参数变量
介绍 当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量 比如: ./myshell.sh 100 200,这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数信息 基本语法 $n (功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}) $*(功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体) $@(功能描述:这个变量也代表命令行中所有的参数,不过$b把每个参数区分对待) $#(功能描述:这个变量代表命令行中所有参数的个数)
位置参数变量 应用实例 案例:编写一个shell脚本 positioonPara.sh,在脚本中获取到命令行的各个参数信息。
1.7 预定义变量
基本介绍 就是shell设计者事先定义好的变量。可以直接在shell脚本中使用 基本语法 $$ (功能描述:当前进程的进程号(PID)) $! (功能描述:后台运行的最后一个进程的进程号(PID)) $? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪一个数,由命令自己来决定),则证明上一个命令执行不正确了。)
正确实例 在一个shell脚本中简单使用以下预定义变量
1.8 Shell 运算符
基本介绍 学习如何在shell中进行各种运算操作 基本语法 1)"$((运算式))"或“$[运算式]” 2)expr m + n 注意 expr运算符间要有空格 3)expr m - n 4) expr \*,/,% 乘,除,取余
应用实例 案例1:计算(2+3)*4的值
1)方式一
2)方式二
3)方式三
案例2:请求出命令行的两个参数的和
1.9 Shell判断语句
判断语句 基本语法 [ condition ] (注意condition前后要有空格) #非空返回true 可使用$?验证(0为true,>1为false)
应用实例
[ atguigu ] | 返回true |
---|---|
[] | 返回false |
[ condition ]&&echo ||echo notok | 条件满足,执行后面的语句 |
常用判断条件 1)两个整数的比较 =字符串比较 -lt 小于 -le 小于等于 -eq 等于 -gt 大于 -ge 大于等于 -ne 不等于 2)按照文件权限进行判断 -r 有读的权限 -w 有写的权限 -x 有执行的权限 3)按照文件类型进行判断 -f 文件存在并且是一个常规的文件 -e 文件存在 -d 文件存在并是一个目录
4)应用实例 案例1:“ok是否等于ok” 判断语句:
案例2:23是否大于等于22 判断语句:
案例3:/root/downloads/a.txt目录中的文件是否存在 判断语句:
1.10 Shell 流程控制if
if判断 基本语法 if [条件判断式];then 程序 fi ------------------------------------------- 或者 if [条件判断式] then 程序 eilf [条件判断式] then 程序 fi
注意事项: (1)[条件判断式],中括号和条件判断式之间必须有空格 (2)推荐使用第二种方式 应用实例 案例:请写出一个shell程序,如果输入的参数,大于等于60,则输出及格了,如果小于60,则输出不及格
或者
1.11 Shell 流程控制case
case语句 基本语法 case $变量名 in "值1") 如果变量的值等于1,则执行程序1 ;; "值2") 如果变量的值等于值2,则执行程序2 ;; ...省略其他分支 *) 如果变量的值都不是以上的值,则执行此程序 ;; esac
应用实例 案例1:当命令行参数是1时,输出”周一,是2时,就输出”周二“,其它情况输出”other“
1.12 Shell流程控制
流程控制 基本语法1 for 变量 in 值1 值2 值3... do 程序 done
应用实例: 案例1:打印命令行输入的参数
1)方法1
2)方法2
基本语法2 for((初始值;循环条件;变量变化)) do 程序 done
应用实例 案例1:从1加到100的值输出显示[这里可以看出$*和¥@的区别]
1.13 Shell流程控制while
while循环 基本语法1 while[条件判断式] do 程序 done
应用实例 案例1:从命令行输入一个数n,统计从1+..+n的值是多少?
1.14 Shell读取控制台输入
基本语法 read(选项)(参数) 选项: -p:指定读取值时的提示符 -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了 变量:指定读取值的变量名
应用实例: 案例1:读取控制台输入一个num值
案例2:读取控制台输入一个num值,在10秒内输入
1.15 Shell系统函数简介
函数介绍 Shell编程和其它编程语言一样,有系统函数,也有自定义函数。系统函数中,我们这里级介绍两个 系统函数 basename基本语法 功能:返回完整路径最后/的部分,常用于获取文件名 basename[pathname][suffix] basename[string][suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个('/')字符,然后将字符串显示出来。) 选项: suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。
应用实例 案例1:请返回/root/downloads/a.txt的”test.txt“部分
dirname基本语法 功能:返回完整路径最后/的前面的部分,常用于返回路径部分 dirname文件绝对路径(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分)),然后返回剩下的路径(目录的部分))
应用实例 案例1:请返回/root/downloads/a.txt的 /root/downloads
1.16 Shell自定义函数
自定义函数 基本语法 [function]funname[()] { Action; [return int;] } 调用直接写函数名:funname
应用实例 案例1:计算输入两个参数的和(read),getSum
2.案例 Shell定时维护数据库
Shell编程总和案例 需求分析 1)每天凌晨2:10备份数据库 atguiguDB 到 /data/backup/db 2)备份开始和备份结束能够给出相应的提示信息 3)备份后的文件要求以备份时间为文件名,并打包成.tar.gz的形式,比如: 2022-09-14_230201.tar.gz 4)在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除
思路分析
代码
crontab -e
10 2 * * * /usr/sbin/mysql_db_backup.sh