shell是一个命令行解释器,它为用户提供了一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。
shell脚本的执行方式
脚本格式要求
脚本以 #!/bin/bash开头
脚本需要可执行权限
编写第一个shell脚本
需求:创建一个shell脚本,输出 hello world!
案例:
脚本的常用执行方式
方式一:输入脚本的绝对路径 或 相对路径
chmod 744 myShell.sh -> 给所有者一个x权限
./myShell.sh -> 相对路径执行
/root/shelltest/myShell.sh -> 绝对路径执行
1 | [root@localhost shelltest]# pwd |
方式二:sh + 脚本
说明:不用赋予脚本 +x权限,直接执行即可
chmod 744 myShell.sh -> 给所有者一个x权限
./myShell.sh -> 相对路径执行
/root/shelltest/myShell.sh -> 绝对路径执行
1 | [root@localhost shelltest]# vim myShell2.sh |
shell脚本的变量
shell变量的介绍
shell变量分为:系统变量 和 用户自定义变量
系统变量:$HOME , $PWD , $SHELL , $USER 等等
1 | [root@localhost shelltest]# echo "$HOME" |
显示当前shell中所有的变量: set
[root@localhost shelltest]# set
shell变量定义
定义变量: 变量=值
撤销变量: unset 变量
声明静态变量: readonly 变量, 注意: 不能unset
可以把变量提升为全局环境变量,可供其他shell程序使用.
编写shell脚本
1 |
|
执行shell脚本,报错,静态变量不能unset
1 | [root@localhost shelltest]# ./myShell.sh |
查看,发现是第9行出错了
shell定义变量规则
1.变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
2.等号两侧不能有空格
3.变量名称一般习惯为大写
将命令的返回值赋给变量(重点)
1.A=`ls` 反引号,运行里面的命令,并把结果返回给变量A
2.A=$(ls) 等价于反引号
1 | [root@localhost shellTest]# pwd |
设置环境变量
基本语法
1.export 变量名=变量值 (功能描述:将shell变量输出为环境变量)
2.source 配置文件 (功能描述:让修改后的配置信息立即生效)
3.echo $变量名 (功能描述:查询环境变量的值)
为了让 /ect/profile 的环境变量生效,需要使用source /ect/profile 重启系统或注销用户.
小案例
1.在 /etc/profile 文件中定义 TOMCAT_HOME 环境变量.
2.查看环境变量: echo $TOMCAT_HOME
3.在另外一个shell程序中使用 TOMCAT_HOME 变量.
定义自己的环境变量TOMCAT_HOME
1 | [root@localhost ~]# vim /etc/profile |
使用自己定义的环境变量TOMCAT_HOME
1
2
3
4
5[root@localhost shellTest]# vim myShell.sh
[root@localhost shellTest]# ./myShell.sh
2018年 04月 17日 星期二 21:21:49 CST
tomcathome=/opt/tomcat
[root@localhost shellTest]#
位置参数变量
介绍
当我们在执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,如: /myshell.sh 100 200 ,这个就是一个执行shell的命令,可以在myshell 脚本中获取到参数信息。
基本语法
$n: n为数字,$0代表命令行本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10}
$*: 代表命令行中的所有参数,$*把所有的参数看成一个整体
$@: 代表命令行中的所有参数,不过$@把每个参数区分对待
$#: 代表命令行中所有参数的个数
案例
编写 positionPara.sh , 在脚本中获取到命令行中的各个参数的细信息
1 | [root@localhost shellTest]# vim positionPara.sh |
预定义变量
就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
基本语法
$$: 当前进程的进程号PID
$!: 后台运行的最后一个进程的进程号PID
$?: 最后一次执行的命令返回的状态,如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值非0(具体哪个数,有命令自己决定),则证明上一个命令执行错误.
实例
在一个preVar.sh 脚本中简单使用预定义变量
运算符
语法
1 | "$((运算式))" 或 "$[运算式]" |
实例
1 | # $((运算式)) |
条件判断
基本语法
1 | [condition] (注意condition前后要有空格) |
实例
1 | [helloShell] 返回true |
常用判断条件
1.两个整数的比较
= 字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
2.按照文件权限进行判断
-r 有读的权限[-r 文件]
-w 有写的权限
-x 有执行的权限
3.按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录
实例
1 | # "ok"是否等于"ok" |
IO流程控制
if判断
1 | 语法: |
case语句
1 | case $变量名 in |
for循环
1 | ## 语法一: |
while循环
1 | while [调价你判断式] |
函数
shell编程和其他编程语言一样,有系统函数,也有自定义函数.
系统函数
basename [pathname] [suffix] ,功能:返回完整的路径最后 / 的部分,常用于获取文件名.
dirname, 功能:返回完整路径最后 /的前面的部分,常用于返回路径部分
1 | [root@localhost shellTest]# basename /shellTest/app.log |
自定义函数
定义函数
[function] funname[()]
{
Action;
[return int;]
}
调用函数:funname [值]
案例
1 | #!/bin/bash |
1 | [root@localhost shellTest]# vim testFun.sh |
shell编程综合案例
需求
1.每天凌晨2:10备份 数据库 flow 到 /data/backup/mysqldb
2.备份开始和备份结束能够给出相应的提示信息
3.备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,如: 2018-03-01_021030.tar.gz
4.在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除
实例
检查mysql数据库的数据文件位置.
1 | 查看mysql的配置信息: cat /etc/my.cnf |
编写shell文件
1 |
|
编写 crontab
1 | [root@localhost shellTest]# crontab -e |