快速入门
格式要求
1)脚本以#!/bin/bash 开头;
2)脚本需要有可执行权限;
第一个Shell脚本
创建一个Shell脚本,输出Hello World!
1)找个目录,集中存放我们的Shell脚本,比如:/home/jack/shell
$mkdir -p /home/jack/shell
$cd /home/jack/shell
$vim MyFirstShell
#!/bin/bash
echo "Hello World!"
2)可执行权限
$chmod 744 MyFirstShell.sh
3)执行脚本
#相对路径
$./MyFirstShell.sh
#绝对路径
$/home/jack/shell/MyFirstShell.sh
注:不给执行权限也可以执行,但是不推荐
$sh ./MyFirstShell.sh
$sh /home/jack/shell/MyFirstShell.sh
Shell变量
Shell变量介绍
Linux Shell中变量分为系统变量和用户自定义变量,系统变量如:
H
O
M
E
,
HOME,
HOME,PWD,
S
H
E
L
L
,
SHELL,
SHELL,USER等等。自定义变量:变量=值。
Shell变量定义
定义变量:变量=值
撤销变量:unset 变量
声明静态变量:readonly 变量,注意不能unset。
定义变量的规则
1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头;
2)等号两侧不能有空格;
3)变量名称一般习惯为大写;
将命令的返回值赋给变量的两种方式
1)A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A;
2)A=$(ls -la) 等价于反引号
设置环境变量
基本语法
1)export 变量名=变量值 /*将Shell变量输出为环境变量*/
2)source 配置文件 /*让修改后的配置信息立即生效*/
3)echo $变量名 /*查询环境变量的值*/
多行注释::<<!..!
单行注释:#
例如:
1)在/etc/profile文件末尾添加:
$vim /etc/profile
export TOMCAT_HOME=/home/tomcat
2)让/etc/profile生效
$source /etc/profile
3)查看环境变量的值
$echo $TOMCAT_HOME
$env /*查看所有的环境变量*/
$set /*查看当前进程重的所有变量*/
位置参数变量
当我们执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量,比如 : ./myshell.sh 100 200 , 这个就是一个执行 shell 的命令行,可以在 myshell 脚本中获取到参数信息。
基本语法
$n
功能描述:n 为数字,$0 代表命令本身,$1-
9
代
表
第
一
到
第
九
个
参
数
,
十
以
上
的
参
数
,
十
以
上
的
参
数
需
要
用
大
括
号
包
含
,
如
9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如
9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如{10}。
∗ 功 能 描 述 : 这 个 变 量 代 表 命 令 行 中 所 有 的 参 数 , * 功能描述:这个变量代表命令行中所有的参数, ∗功能描述:这个变量代表命令行中所有的参数,*把所有的参数看成一个整体。
@ 功 能 描 述 : 这 个 变 量 也 代 表 命 令 行 中 所 有 的 参 数 , 不 过 @ 功能描述:这个变量也代表命令行中所有的参数,不过 @功能描述:这个变量也代表命令行中所有的参数,不过@把每个参数区分对待。
$#
功能描述:这个变量代表命令行中所有参数的个数。
#!/bin/bash
#获取到各个参数
echo "命令行本身=$0,参数1=$1,参数2=$2"
echo "$*"
echo "$@"
echo "参数个数=$#"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2NfuU1ZN-1580740679165)(13BE1A7AD5C94D0EA2C6B826589B8C3A)]
预定义变量
就是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用。
$$ 当前进程的进程号(PID);
$! 后台运行的最后一个进程的进程号(PID);
$? 后台最后一条指令的执行结果。0代表正确执行;非0代表未正确执行。
#!/bin/bash
echo "当前进程的进程号=$$"
#后台的方式运行MyFirstShell.sh
./MyFirstShell.sh &
echo "最后进程的进程号=$!"
echo "最后指令的执行结果=$?"
运算符
1)&((运算式)) 或者 $[运算式]
2)expr m + n /*注意运算符间要有空格*/
实例:计算(2+3)*4的值。
#!/bin/bash
#第一种方式$(())
echo "(2+3)*4=$(((2+3)*4))"
#第二种方式$[]
echo "(2+3)*4=$[(2+3)*4]"
#第三种方式expr
TEMP=`expr 2 + 3`
RESULT=`expr $TEMP \* 4`
echo "(2+3)*4=$RESULT"
条件判断
[ condition ](注意 condition 前后要有空格)
常用判断条件:
1)两个整数的比较
= 字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
注:l=less t=than e=equal g=greater
SO
lt=less than 小于
le=less and equal 小于等于
eq=equal 等于
gt=greater than 大于
ge=greater and equal 大于等于
ne=not equal不等于
2)按照文件权限进行判断
-r 有读的权限 [ -r 文件 ]
-w 有写的权限
-x 有执行的权限
3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并是一个目录
案例:
#!/bin/bash
#案例 1:"ok"是否等于"ok"
if [ "ok" = "ok" ]
then
echo "equals"
else
echo "not equals"
fi
#案例 2:23 是否大于等于 22
if [ 23 -ge 22 ]
then
echo "yes"
else
echo "no"
fi
#案例 3:/root/install.log 目录中的文件是否存在
if [ -e /root/install.log ]
then
echo "yes"
else
echo "no"
fi
流程控制
if case for while等
read读取控制台输入
read 选项 参数
-p 指定读取值时的提示符;
-t 读取值时的等待时间(秒);
例如:read -t 10 -p "请在10秒内输入一个数:"
函数
shell 编程和其它编程语言一样,有系统函数,也可以自定义函数。系统函数中,这里介绍两个。
两个系统函数
1)basename
返回完整路径最后 / 的部分,常用于获取文件名。
basename [pathname] [suffix]
截取pathname最后/后面的内容,并且根据suffix去掉后缀。
例如:basename /home/jack/jack.txt .txt
2)dirname
返回完整路径最后 / 的前面的部分,常用于返回路径部分。
dirname 文件绝对路径
例如:dirname /home/jack/jack.txt
自定义函数
[function] funname[()]
{
Action;
[return int;]
}
调用直接写函数名:funname [值]
实例:
#!/bin/bash
#编写函数求输入的两个参数的和。
function sum(){
SUM=$[$n1+$n2]
echo "sum=$SUM"
}
read -p "请输入第一个参数:" n1
read -p "请输入第二个参数:" n2
#调用函数
sum $n1 $n2
Shell编程综合案例
1)每天凌晨 2:10 备份数据库 atguiguDB 到 /data/backup/db
2)备份开始和备份结束能够给出相应的提示信息
3)备份后的文件要求以备份时间为文件名,并打包成 .tar.gz 的形式,比如:2018-03-12_230201.tar.gz
4)在备份的同时,检查是否有10天前备份的数据库文件,如果有就将其删除
思路:
1)备份数据库需要高权限,Shell脚本存放到/usr/sbin目录下;
2)要备份的数据库atguiguDB;
3)备份到/data/backup/db目录下;
4)将脚本设置到crond执行;
#备份路径
BACKUP=/data/backup/db
#当前时间作为文件名
DATETIME=$(data +%Y_%m_%d_%H%M%S)
#输出变量调试
#echo ${DATETIME}
echo "==========开始备份========="
echo "==========备份路径:$BACKUP/$DATETIME.tar.gz========="
#主机
HOST=localhost
#用户名
DB_USER=root
#密码
DB_PWD=root
#数据库名
DATABASE=atguiguDB
#备份路径,有就使用,没有就创建
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
#执行备份数据库的指令
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz
#打包备份文件
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
#删除临时目录
rm -rf $BACKUP/$DATETIME
#删除10天前的备份文件
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "=========备份成功========="
crontab -e
10 2 * * * /usr/sbin/mysql_db_backup.sh