sehll 介绍:
shell 是一个命令解释器,用来翻译用户输入的指令给内核,内核驱动硬件,硬件将结果返回给内核,内核打印到屏幕
sehll 脚本:
(1)将系统命令堆积起来,顺序执行
(2)特定格式+特定语法+系统命令=脚本
shell 脚本编写规范:
- 开头加#!/bin/bash 作用:告诉脚本使用哪种命令解释器
- 附带作者及版权信息
- 编写的脚本放在固定目录下
- 脚本的扩展以.sh 结尾
- 脚本中尽量不要使用中文
- 成对的符号一次书写完成
- 循环格式一次性输入完成
exit 、break、continue 三者区别 在此篇:https://www.jianshu.com/p/496c9d9f1b88
一、变量:
1、什么使变量:就是用一个固定的字符串去表示不固定的值,便于后续引用。
2、shell 变量的定义方式:
2.1用户自定义变量:人为定义变量
生效范围:只对当前进程有效
自定义变量的命名规范:
1、建议使用大写字母、小写字母、下划线组成
2、变量名具备一定的含义
3、不能数字开头
4、非连续的字符或数字使用 单''、双""引号引起来。
单双引号的作用
单引号:#单引号,弱引用,不会解析引号中的变量
双引号:#强引用,会解析引号中的变量
如:
Cpu_load_ava_1=5
HostName="db01"
Address_eth0='172.16.1.10'
Log='hello word'
[root@db01 ~]# Log='hello word'
[root@db01 ~]# echo ${Log}_good
hello word_good
[root@db01 ~]#
2.2系统环境变量:保存的是和系统环境相关的数据
查看当前系统的环境变量:exoprt 或env
系统环境变量可以直接使用
2.2.1 自定义系统环境变量
[root@db01 ~]# export var=123
[root@db01 ~]# sh var.sh
123
[root@db01 ~]# cat var.sh
#!/usr/bin/bash
##################################
#Filename: var.sh
#Author: xiaoxi
#Email: xiaoxi@qq.com
#Date: 2019-09-22
####################################
echo $var
[root@db01 ~]#
2.3位置参数变量:向脚本中传递参数,变量名不能自定义,变量的作用是固定的
位置参数 | 作用 |
---|---|
$n | n 为数字,$1 表示出现的第一个参数$2 为第二个以此类推 ,10 以上的参数需要用大括号包含, 如${10} |
2.4预定义的变量:在bash中已经定义好的,变量不能自定义,变量的作用也是固定的。
位置参数 | 作用 |
---|---|
$0 | 这个变量表示执行的脚本本身 |
$* | 这个变量代表命令行中所有的参数,把所有的参数看成一个整体 |
$@ | 这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区别对待 |
$# | 这个变量代表命令行中所有参数的个数 |
$? | 返回上一条命令的执行结果 |
$$ | 返回当前进程的PID |
-----------------------------$与$@的区别------------------------------------------
不加引号时,二者都是返回传入的参数
加了引号后,
$ 把参数作为一个字符串整体(单字符串)返回
$@ 把每个参数作为一个一个的字符串进行返回
位置变量和预定义变量演示如下:
[root@db01 ~]# cat var.sh
#!/usr/bin/bash
echo '当前脚本的名称' $0
echo '当前脚本的第一个变量' $1
echo '当前脚本的第二个变量'$2
echo '当前脚本的第三个变量'$3
echo '当前脚本的变量个数 '$#
echo '当前脚本的所有的变量是'$@
echo '当前脚本的所有变量个数是'$*
echo '上一条命令的执行结果是'$?
echo '此脚本执行的进程的PID是' $$
[root@db01 ~]# sh ~/var.sh aa bb cc
当前脚本的名称 /root/var.sh
当前脚本的第一个变量 aa
当前脚本的第二个变量bb
当前脚本的第三个变量cc
当前脚本的变量个数 3
当前脚本的所有的变量是aa bb cc
当前脚本的所有变量个数是aa bb cc
上一条命令的执行结果是0
此脚本执行的进程的PID是 44107
[root@db01 ~]#
3、变量赋值
shell 中 read的使用
read -p "请输入..." -p 后面跟描述
read -t 3 -p "请输入..." -t 后面跟超时时间
举例:
[root@db01 /server/scripts]# cat var1.sh
#!/usr/bin/bash
###############################
#Filename:var1.sh
#Author:xiaoxi
#Email:xiaoxi@qq.com
#Date: 2019-09-22
#Version:1.1
################################
read -p "请输入您要备份的目录或文件:" backup #backup 是变量
read -t 10 -p "您确定要备份吗 Y|N?" action #同样的action 也是变量
if [ $action == "y" ] ;then
echo "--------backup start --------------"
sleep 3
echo "-----------backup $backup done -------------"
else
echo "--------------backup flase------------"
fi
[root@db01 /server/scripts]#
4、变量的替换
变量 | 说明 |
---|---|
${变量#匹配规则} | 从头开始匹配,最短删除 |
${变量##匹配规则} | 从头开始匹配,最长删除 |
${变量%匹配规则} | 从尾开始匹配,最短删除 |
${变量%%匹配规则} | 从尾开始匹配,最长删除 |
${变量/旧字符串/新字符串} | 替换变量内的旧字符串为新字符串,只替换第一个 |
${变量//旧字符串/新字符串} | 替换变量内的旧字符串为新字符串,全局替换 |
从头部开始删除
[root@db01 ~]# echo $url
www.xiaoxi.ren
[root@db01 ~]# echo ${url#*.}
xiaoxi.ren
[root@db01 ~]# echo ${url##*.}
ren
[root@db01 ~]#
从尾部开始删除
[root@db01 ~]# echo $url
www.xiaoxi.ren
[root@db01 ~]# echo ${url%.*}
www.xiaoxi
[root@db01 ~]# echo ${url%%.*}
www
[root@db01 ~]#
5、 变量运算
num1 + num2 加
num1 - num2 减
num1 * num2 乘
num1 / num2 除
num1 % num2 余
运算方法 :
expr :
[root@db01 ~]# expr 1 + 1
2
[root@db01 ~]#
$(()):
[root@db01 ~]# echo $(($(date +%Y)+1))
2020
[root@db01 ~]#
$[]:
[root@db01 ~]# echo $[1+1]
2
[root@db01 ~]#
举例:在脚本中变量参与简单运算
#!/usr/bin/bash
read -p "请输入你要传入的第一个数字: " num1
read -p "请输入你要传入的第二个数字: " num2
echo "$num1 + $num2 = $(( $num1 + $num2 ))"
echo "$num1 - $num2 = $(( $num1 - $num2 ))"
echo "$num1 * $num2 = $(( $num1 * $num2 ))"
echo "$num1 / $num2 = $(( $num1 / $num2 ))"
统计变量的长度
[root@db01 ~]# num=111222333
[root@db01 ~]# echo ${#num}
9
[root@db01 ~]#
二 、if 语句的
流程控制if 语句的三种格式:
if语句做条件判断的时候,中括号前后必须有空格
1、单分支if语句
if [ 判断条件 ];then
条件;
fi
2、双分支if 语句
if [ 判断条件 ];then
条件;
else
条件;
fi
3、多分支if语句
if [ 判断条件 ];then
条件;
eilf [ 判断条件 ];
条件;
else
条件;
fi
2、流程控制语句四种比较方式
2.1 流程控制语句if文件比较
常用参数 | 作用 | 示例 |
---|---|---|
-s | 如果文件存在并且不为空则为真 | [ -s /ect/file ] |
-e | 如果文件或目录存在则为真 | [ -e /ect/file ] |
-d | 如果文件存在且为目录则为真 | [ -d /ect/file ] |
-f | 如果文件存在且为普通文件则为真 | [ -f /ect/file ] |
-r | 如果文件存在且可读则为真 | [ -r /ect/file ] |
-w | 如果文件存在且可执行则为真 | [ -w /ect/file ] |
-x | 如果文件存在且可执行则为真 | [ -x /ect/file ] |
2.2流程控制语句if整数比较
参数 | 说明 | 示例 |
---|---|---|
-eq | 等值为真 | [ 1 -eq 1 ] |
-ne | 不等值为真 | [ 1 -eq ] |
-gt | 大于条件为真 | 1 -gt 10 ] |
-lt | 小于条件为真 | [ 1 -lt ] |
-ge | 大于等于条件为真 | [ 1 -ge 10 ] |
-le | 小于等于为真 | [ 1 -eq 10 ] |
2.3流程控制语句if字符比较
参数 | 说明 | 示例 | 额外示例 |
---|---|---|---|
== | 等于条件则为真 | [ b] | |
!= | 不相等条件为真 | [ "b" ] | |
-z | 字符串长度为0则为真 | [ -z "$a"] | 变量$a为空则为真 |
-n | 字符串长度不为空则为真 | [ -n "$a" ] | 变量$a有内容 |
var1>var2 | var1大于var2为真 | [ var1>var2] | |
var1<var2 | var1小于var2为真 | [ var1<var2] |
2.4流程控制语句if正则比较
使用正则表达式比较必须使用双中括号比较
[[ "$user" =~ ^[0-9]+$ ]] 判定变量是不是全部为数字
[[ "$user" =~ ^[a-z]+$ ]] 判断变量是不是全部是小写字母
[[ "$user" =~ ^[A-z]+$ ]] 判断变量是不是全部是大写字母
[[ "$user" =~ ^[a-Z]+$ ]] 判断变量是不是以字母开头
[[ ! "$user" =~ ^[a-Z]+$ ]] 如果$user 不是字母则为真;(!表示对条件取反)
[root@db01 ~]# user=abcD
[root@db01 ~]# [[ "$user" =~ ^[a-Z]+$ ]] ;echo $?
0
3、if 三种语句使用
3.1 单分支语句使用
[root@db01 /server/scripts]# cat if.sh
#!/usr/bin/bash
if grep "$1" /etc/passwd;then
echo "ok"
fi
[root@db01 /server/scripts]#
3.2 双分支
[root@db01 /server/scripts]# cat if.sh
#!/usr/bin/bash
if grep "$1" /etc/passwd;then
echo "ok"
else
echo "err"
fi
[root@db01 /server/scripts]#
3.3 多分支
#!/usr/bin/bash
read -p "请输入成绩: " cj
if [[ ! $cj =~ ^[0-9]+$ ]];then
echo "请输入纯数字....."
exit 1
fi
if [ $cj -ge 0 -a $cj -le 59 ];then
echo "补考"
elif [ $cj -ge 60 -a $cj -le 80 ];then
echo "良好"
else
echo "优秀!"
fi
三、勤加练习
1.在每月第一天备份并压缩/etc目录的所有内容,存放到/root/bak目录,存放的形式
2019_04_10_etc.tar.gz,脚本名称为fileback,存放在/root的家目录下
2.编写一个脚本,使用systemctl检测服务是否运行的
1.如何判断我们服务是否是运行 systemctl status sshd
2.判断前者命令执行是否成功,成功则输出运行,失败则输出程序灭有运行
3.查看磁盘/当前使用状态,如果使用率超过80%则报警发邮件
1.怎么查看磁盘 # df -h
2.怎么提取使用率 df -h|grep "/$"|awk '{print $(NF-1)}' echo ${disk/\%/}
3.判断,整数
4.备份mysql,手动输入你需要备份的库名称
1.提示用户手动输入库名称:read
2.如果用户输入数据库名称,则执行mysqldump命令备份
3.备份到哪,/backup/mysql
5.根据学生录入的成绩判断,学生的优劣,可以使用if单条件,和if的多条件
1-59 补考
60-80 合格
80-100 优秀
6.使用root用户清空/var/log/messages日志,并每次执行保留最近100行
1、判断必须是root 字符串判断
2、判断文件必须存在 文件判断
3、情空后需要保留最近100 tail
7.判断httpd服务是否正常启动 文件名必须是httpd_daemon.sh
8.根据不同的系统安装不同的yum源
9.安装不同版本的PHP, echo输出即可
10.查看内存/当前使用状态,如果使用率超过80%则报警发邮件
1.如何查看内存 free -m
2.如何查看内存百分比 使用的/总的*100=使用百分比 free -m|awk '/^Mem/ {print $3/$2*100}'
11.写一个创建用户的脚本,需要输入创建用户的前缀,比如oldboy,以及后缀。比如123。
read -p "请输入您要创建的用户前缀:" user_qz
read -p "请输入您要创建用户的后缀: " user_hz
id $user_qz$user_hz &>/dev/null
if [ $? -eq 0 ];then
echo "$user_qz$user_hz 用户已经存在"
else
useradd $user_qz$user_hz
if [ $? -eq 0 ];then
echo "$user_qz$user_hz 用户已经创建"
else
echo "创建用户失败"
fi
fi
12.备份MySQL中的所有数据库,每个库一个.sql的文件,记得排除没用的
1.如何拿到所有的库名称
2.拿到后一个一个备份
13.写一个rsync的启动和停止的脚本
1.如何启动的命令 rsync --daemon
ps aux|grep rsync|grep -v grep
2.如何停止kill,
pkill rsync
3.脚本名称rsync_daemon
14.case场景示例,编写一个nginx的启动和停止脚本。(不允许重复执行脚本,加锁。)
1.如何启动 /usr/sbin/nginx
2.如何停止 /usr/sbin/nginx -s stop
3.如何重载 /usr/sbin/nginx -s reload
网友评论