shall精讲目录
什么是Shall
**Shall:**是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序.
格式要求
- 脚本以
#!/bin/bash
开头 - 脚本需要有可执行的权限
执行方式
- 脚本的绝对路径或相对路径
- 给予脚本权限(给予a.sh+X权限)
- 执行脚本
- sh+脚本
说明:不用给予权限,直接执行
Shall变量
- Linux Shell中的变量分为,系统变量和用户自定义变量。
- 系统变量:
$HOME
、$PWD
,$SHELL
,$USER
等等比如:echo $HOME
等 - 显示当前Shall中所有变量:set
Shall变量的定义
- 基本语法
- 定义变量:变量=值
- 撤销变量:unset 变量
- 声明静态变量: readonly变量(不能unset)
- 注释的使用
- 单行注释
#
- 多行注释
:<<! I=10!
- 单行注释
- 快速入门
# 定义变量
A=100
echo "A=$A"
# 变量撤销
unset A
readonly B=99
echo "B=$B" # B不能被撤销
定义变量的规则
- 变量可以由字母、数字、下划线组成,但是不能以数字开头
- 等号两边不能有空格
- 变量名一般习惯大写
将命令的返回值赋值给变量
- A=
ls-la
反引号,运行里面的命令,并且把结果返回给变量A - A=$(ls-la) 等价于反引号
环境变量设置
- 基本语法
export 变量名=变量值(将shall变量输出为环境变量)
source 配置文件(让修改后的配置信息立即生效)
echo $变量名(查询环境变量的值)
位置参数变量
介绍
当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如: /myshell.sh 100 200,这个就是一个执行shell的命令行,可以在myshell 脚本中获取到参数信息
基本语法
$n
(功能描述: n为数字, so代表命令本身, SI-S9代表第一到第九个参数,十以上的参数,以上的参数需要用大括号包含,如${103 )
s*
(功能描述:这个变量代表命令行中所有的参数, s*把所有的参数看成一个整体)$@
(功能描述:这个变量也代表命令行中所有的参数,不过 @把每个参数区分对待)$#
(功能描述:这个变量代表命令行中所有参数的个数)
预定义变量
基本介绍
预定义变量:shell设计者事先已经定义好的变量,可以直接在shell脚本中使用## 基本语法
$s
(功能描述:当前进程的进程号(PID) )$!
(功能描述:后台运行的最后一个进程的进程号(PID) )$?
(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数, 由命令自己来决定) ,则证明上一个命令执行不正确了。)
以后台的方式去运行,例如:以后台的方式运行a.sh----->a.sh &
运算符
基本语法
$((运算式))
或$[运算式]
- expr m+n expr运算间要有空格
- expr *,/% 乘,除,取余
条件判断
- [ condition ] 注意 condition前后都要有空格
非空返回true,可以使用$?验证(0为true,>1为false)
应用[ condition ] && echo OK || echo notok
条件满足,执行后面的语句
常用的判断条件
两个整数的比较
- =字符串比较
- -It小于
- -le小于等于
- -eq等于
- -gt大于
- -ge大于等于
- -ne不等于
按照文件权限进行判断 - -r有读的权限[-r文件]
- -w有写的权限-
- x有执行的权限
按照文件类型进行判断 - -f文件存在并且是一个常规的文件
- -e文件存在
- -d文件存在并是一个目录
案例
if ["ok" = "ok" ]
then
echo "equal"
fi
if判断
- 基本语法
if[ 条件 ];then
程序
fi
或者
if[ 条件 ]
then
程序
elif[ 条件 ]
then
程序
fi
case语句
case $变量名 in
"值1")
如果变量等于值1,执行程序1
;;
"值2")
如果变量等于值2,执行程序2
;;
*)
for循环
语法一
for 变量 in 值1 值2 值3
do
程序
done
语法二
for ((初始值;循环控制条件;变量变化))
do
程序
done
while循环
while[ 条件 ]
do
程序
done
read从控制台输入
格式:read(选项)(参数)
选项
- -p:指定读取值时的提示符
- -t:指定读取值时的等待的时间(秒),如果没有指定的输入时间内输入,就不等待了
read -p "请输入一个数num1=" NUM1
echo "你输入的是num1=$num1"
# 在规定的时间内输入
read -t 10 -p"输入一个参数num2="NUM2
函数
shell编程和其他编程语言一样,有系统函数,也有自定义函数。
系统函数
- basename
功能: 返回完整路径最后/
后面的部分,常用于获取文件名
格式: basename[pathname][suffix]
功能描述: basename命令会删除所有前缀包括最后一个/
字符,然后将字符串显示出来
选项: suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉。 - dirname
功能: 返回完整路径最后/
前面的部分,常用于返回文件路径
功能描述: 从给定的包含绝对路径的文件名去除中文名(非目录的部分),然后返回剩下的路径(目录的部分)
应用
- basename
basename /home/m/data/data.txt
输出:data.txt
basename /home/m/data/data.txt .txt
输出:data - dirname
dirname /home/m/data/data/txt
输出:/home/m/data/data
自定义函数
- 基本语法
[function] funname[()]
{
Action;
[return int;]
}
- 调用
funname[值]
- 应用
function getSum(){
SUM=$[$n1+$n2]
echo "和=$Sum"
}
read -p "请输入第一个数:"n1
read -p "请输入第二个数:"n2
getSum $n1 $n2
shell综合应用
需求
- 每天定时备份数据库到/data/backup/db
- 备份开始和结束给出相应提示
- 备份后的文件以备份的时间为文件名,并且打包为.tar.gz
- 备份的同时检查十天前备份的数据库文件,如果有将其删除
# 主机
HOST=localhost
# 用户
BD_USER=root
# 密码
DB_PWD=2001
# 备份数据库名
DATABASE=COM_IT
# 创建备份路径,如果备份路径存在就使用,否则创建
[! -d "$BACKUP/$DATATIME"] && mkdir -p "$BACKUP/$DATATIME"
# 执行mysql备份指令
mysqldump -u${BD_USER} -p{DB_PWD} --host=$HOST $DATABASE | gzip >$BACKUP/$DATATIME/$DATATIME.sql.gz
# 打包备份
cd $BACKUP
tar -zcvf $DATATIME.tar.gz$DATATIME
# 删除临时目录
rm -rf $BACKUP/$DATATIME
# 删除十天前的备份文件
find $BACKUP -mtime+10 -name "*.tar.gz" -exec rm -rf{}\;