文章目录
什么是shell?
快速入门
1.脚本需要以 #!/bin/bash 开头,来指定执行脚本的解析器
2.脚本需要可执行权限
案例
1.创建一个简单的shell脚本
2.编写shell脚本
3.添加脚本权限
4.然后执行
shell 变量
系统变量
$HOME,$PWD,$USER,$PATH....
可以使用 set | more 显示所有当前 Shell 所有变量
自定义变量
基本语法
- 定义变量:变量=值
2)撤销变量:unset 变量 - 声明静态变量:readonly 变量,注意:不能unset
案例
声明静态的变量B,不能 unset
变量定义规则
1.变量和java有曲同工之妙,可以由字母下划线,数字,组成,但是不能以数字开头
2.等号两侧不能有空格
3.变量名字一般习惯大写
变量赋值
执行
设置环境变量已经shell注释
基本语法
1) export 变量名=变量值 (功能描述:将shell变量输出为环境变量)
2) source 配置文件 (功能描述:让修改后的配置信息立即生效)
3) echo $变量名 (功能描述:查询环境变量的值)
示意图
位置参数变量
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量 比如 :
./myshell.sh 100 200 , 这个就是一个执行shell的命令行,可以在 myshell 脚本中获取到参数信息
基本语法
$n (功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参 数需要用
大括号包含,如${
10})
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@(功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
$#(功能描述:这个变量代表命令行中所有参数的个数)
案例
预定义变量
就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
$$ (功能描述:当前进程的进程号(PID))
$! (功能描述:后台运行的最后一个进程的进程号(PID))
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个
变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
案例
运算符
基本语法
1) “$(( 运算式 ))”或“$[ 运算式 ]” (推荐)
2) expr m + n 注意expr运算符间要有空格
3) *, /, % 乘,除,取余
执行
请求出命令行的两个参数[整数]的和
执行
条件判断
[ condition ](注意condition前后要有空格) 非空返回true,可使用$?验证(0为true,>1为false)
应用实例
[ atguigu ] 返回true
[] 返回false
[condition] && echo OK || echo notok 条件满足,执行后面的语句
常用判断条件
1) 两个整数的比较
= 字符串比较 -lt 小于 -le 小于等于 -eq 等于 -gt 大于 -ge 大于等于 -ne 不等于
2) 按照文件权限进行判断
-r 有读的权限 -w 有写的权限 -x 有执行的权限
3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件 -e 文件存在 -d 文件存在并是一个目录
流程控制(重点)
if 判断
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
fi
注意事项:(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格(2) 推荐使用第二种方式
case 流程
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
测试
for 循环
基本语法1
for 变量 in 值1 值2 值3…
do
程序
done
实际上使用 $@ 较多,因为可以对参数集合中的每一个参数进行处理
基本语法2
for (( 初始值;循环控制条件;变量变化))
do
程序
done
while 循环
while [ 条件判断式 ]
do
程序
done
读取控制台输入 #
read(选项) (参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。。 参数
参数
变量:指定读取值的变量名
案例1:读取控制台输入一个num值
函数 #
包含系统内置函数和自定义函数,这里简单介绍两个常用的内置函数
basename
功能:返回完整路径最后/ 的部分,常用于获取文件名
basename pathname [suffix]
basename string [suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个(‘/’) 字符,然后将字符串
显示出来
选项: suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉
dirname
功能:返回完整路径最后/ 的前面的部分,常用于返回路径部分
自定义函数
[ function ] funname[()]
{
Action;
[return int;]
} 调用直接写函数名:funname [值]
案例1:计算输入两个参数的和, getSum
数据库备份脚本
#!/bin/bash
# 完成数据库的定时备份
# 数据库备份的路径
BACKUP=/opt/module/data
# 数据库备份文件名
BACKUP_FILENAME=$(date "+%Y-%m-%d_%H-%M-%S")
# echo $BACKUP_FILENAME 测试文件名是否ok
echo "=============开始备份中============"
echo "=============备份的文件名为${BACKUP}/${BACKUP_FILENAME}.tar.gz=========="
# mysql主机名
HOST=localhost # 远程备份写对应的ip地址即可
# 用户名
DB_USER=root
# 密码
DB_PASSWORD=123456
# 备份数据库的名称
DATABASE=hivef.sql
# 创建备份的路径:如果存在就什么都不做;如果不存在就创建
[ ! -e "$BACKUP/$BACKUP_FILENAME" ] && mkdir -p "$BACKUP/$BACKUP_FILENAME"
# 执行mysql 的备份命令
mysqldump -u${
DB_USER} -p${
DB_PASSWORD} --host=${
HOST} ${
DATABASE} | gzip >
${
BACKUP}/${
BACKUP_FILENAME}/${
BACKUP_FILENAME}.sql.gz