Linux(4)Shell编程

快速入门

格式要求
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值