本节所讲内容
22.1 跳出循环
22.2 shift 参数左移指令
22.3 函数的使用
22.4 实战-shell脚本实战
22.1 跳出循环
在我们使用循环语句进行循环的过程中,有时候需要在未达到循环结束条件时强制跳出循环,那么shell为我们提供了两个命令来实现该功能: break 和continue
22.1.1 break 和continue
Break : 跳出整个循环
Continue : 跳出本次循环,进行下次循环
break:
例1 :写一个shell菜单,当按下数字4时推出,否则一直循环显示
①[root@localhost ~]# vim b.sh
②#! /bin/bash
if [ $# -le 0 ];then
echo 没有足够的参数
exit
fi
sum=0
while [ $# -gt 0 ];
do
#sum=(expr $sum + $1)
sum=[$sum+$1]
shift
# shift 2 一次移动两个参数
done
echo result is $sum
③[root@localhost ~]# bash break-continue.sh
******************************
Please select your operation:
1 Copy
3 Backup
4 Quit
******************************
互动: 先演示一下效果,让大家思考一下,这个脚本的思路,然后带我写
echo 123456 | passwd --stdin mk 给mk 用户输入密码
①[root@localhost ~]# vim adduser2.sh
②#! /bin/bash
while : # 条件一直为真
do
read -p "please enter prefix & password & num:" pre pass num
printf "user information
*************************
user prefix:$pre
user password:$pass
user number:$num
************************"
read -p "Are you sure ? [ y/n ]" action
if [ "$action" == "y" ];then
break
fi
done
for i in $( seq $num) #从i=1 开始,取到$num 。seq 表示1-$num
# $(seq $num) 等于 `seq $num` 反引号
for i in $(seq $num) # 从i =1开始,取到 $num 。 seq 表示 1-$num
#$(seq $num)等于`seq $num ` ; $( 命令 ) ; ${ 变量 } ; [ 表达式/条件 ]
do
user=${pre}${i}
id $user &> /dev/null # 正确的输入到null中
if [ $? -ne 0 ];then
useradd $user
echo "$pass" | passwd --stdin $user &> /dev/null
if [ $? -eq 0 ];then
echo -e "\033[31m$user\033[0m creat" 用红色来显示用户名
fi
else
echo "user $user exist"
fi
③please enter prefix & password & num:mkk 123456 5
user information
*************************
user prefix:mkk
user password:123456
user number:5
************************Are you sure ? [ y/n ]y
mkk1 creat
mkk2 creat
mkk3 creat
mkk4 creat
mkk5 creat
22.2 Shift 参数左移指令
vim shift.sh
#! /bin/bash
if [ $# -le 0 ];then # 当前参数
echo "没有足够的参数"
fi
sum=0
while [ $# -gt 0 ];
do
sum=$[ $sum + $1 ]
shift
#shift 一次移动两个参数
done
echo result is $sum
22.3 函数的使用
函数是一个脚本代码块,你可以对它进行自定义命名,并且可以在标本任意位置使用这个函数,啊哟使用函数,只要使用这个函数名称就可以了,使用函数的好处,模块化,代码可毒性强
22.3.1 函数创建语法
方法1
function name {
commands
}
注意 :name是函数唯一的名称
方法2:
name (){
commands
}
调用函数语法
函数名 参数1 参数2
调用函数时 ,可以传递参数,在函数汇总用$1,$2,$3 来引用传递的参数
①[root@localhost ~]# vim fun1.sh
②
#! /bin/bash
function fun_1 {
echo "aaaaa"
}
function fun_1 {
echo "this is 2222222222222"
}
fun_1
③ [root@localhost ~]# bash fun1.sh
this is 2222222222222 就近原则
22.3.3 返回值
使用return 命令来退出函数并返回特定的退出码
①vim fun1.sh
②#! /bin/bash
function fun_1 {
echo "this is function"
ls /etc/passwd
return 3
}
fun_1
③[root@localhost ~]# bash fun1.sh
this is function
/etc/passwd
④root@localhost ~]# echo $?
3
返回值
使用return 命令来退出函数并返回特定的退出码,后期根据退出码来判断是哪种错误
比如开发定义 0 代码成功 1 代码文件找不到 2 代码权限不足
注意: 状态码的确定必须在在函数一结束就运行return 返回值: 状态码的取值范围0 -255
互动: exit 数字 和return 数字的区别
exit 整个脚本退出,往回数字 ; return 只是函数最后一行,燃火返回数字,只能让函数后面的命令不执行,无法强制退出整个函数
22.3.4 把函数赋值给变量使用
例子: 函数名就相当于一个命令
1)vim fun-1.sh
2)#! /bin/bas
fun1(){
read -p "Input a value:" va
echo $[ $va*5 ]
}
num=$(fun1)
echo current num is $num
3) [root@localhost ~]# bash fun1.sh
Input a value:2
current num is 10
22.3.5 函数的参数传递
第一种:通过脚本传递参数给函数中的位置参数$1
1)[root@localhost ~]# vim fun1.sh
#! /bin/bas
fun1(){
rm -rf $1
}
fun1 $1
~
2)[root@localhost ~]# bash fun1.sh for-1.sh
第二种:调用函数时直接传递参数
[root@localhost ~]# touch a.txt
[root@localhost ~]# vim fun1.sh
#! /bin/bash
fun1(){
rm -rf $1
}
fun1 /root/a.txt
[root@localhost ~]# bash fun1.sh
[root@localhost ~]# ls a.txt
ls: cannot access a.txt: No such file or directory
1)[root@localhost ~]# vim fun1.sh
2)[root@localhost ~]# vim fun1.sh
#! /bin/bash
fun1(){
echo $[ $1*5 ]
echo $[ $1*2 ]
}
fun1 5 2 # 直接传两个参数
2)[root@localhost ~]# bash fun1.sh 测试
25
4
22.3.6 函数中变量的处理
函数使用的变量类型有两种
局部变量
全局变量
1 全局变量,默认情况下,你在脚本中定义的变量都是全局变量,在你在脚本外面定义的变量在函数内也可以使用
①②③[root@localhost ~]# vim fun1.sh
echo $[ $1*5 ]
#! /bin/bash
function fun1(){
num1=$[ var1*2 ]
}
read -p "input a num:" var1
fun1
echo the new value is:$num1
[root@localhost ~]# bash fun1.sh
input a num:12
the new value is:24
22.4 实战-自动备份mysql 数据库脚本和nginx 服务启动脚本
22.4.1 自动备份mysql 数据库脚本
从centos7.0 开始,系统中自带的mysql 数据库包 ,该名为mariadb 数据库
首先安装一下mariadb
1) [root@localhost ~]# yum install -y mariadb mariadb-server
2) [root@localhost ~]# rpm -qf /usr/bin/mysql
mariadb-5.5.64-1.el7.x86_64
启动数据库
3)[root@localhost ~]# systemctl start mariadb.service
登录mysql
mysqladmin -u root password '123456' 给root用户配置一个密码 123456
4) [root@localhost ~]# mysql -u root 直接登录上去 默认是没有密码的
创建数据库和表
并插入数据
mysql 自动化备份脚本
思路:
1 ,检查一下运行环境: 目录是否存在,时间,权限,用户
2 运行要执行的命令: 备份,到处数据
3 把命令执行过程中 没有用的文件删除一下
4 弹出命令运行成功的消息
1)[root@localhost ~]# vim mysql-back-auto.sh
脚本
#! /bin/bash
#auto backup mysql
#Define PATH 定义变量
BAKDIR=/data/backup/mysql/`date +%Y-%m-%d` # 备份的地址
MYSQLDB=xuegod1 #备份的数据库的名称
MYSQLUSR=root
MYSQLPW=123456
#MYSQLPD #mysql 数据库密码
#must use root user run script 必须使用root 用户运行,$UID 系统变量
if
[ $UID -ne 0 ];then
echo This script must use the root user! ! !
sleep 2
exit 0
fi
# Define DIR and mkdir DIR 判断目录是否存在,不存在则新建
if
[ ! -d $BAKDIR ];then
mkdir -p $BAKDIR
else
echo This is $BAKDIR exists
exit
fi
# Use mysqldump backup mysql 使用mysqldump 备份数据库
/usr/bin/mysqldump -u$MYSQLUSR -p$MYSQLPW $MYSQLDB > $BAKDIR/${MYSQLDB}_db.sql
cd $BAKDIR; tar -czf ${MYSQLDB}_db.tar.gz *.sql
# 查找备份目录一下以.sql 结尾的文件并删除成功
find $BAKDIR -type f -name *.sql -exec rm -rf {} \;
#或者
# 如果数据库备份成功,则打印成功,并且删除备份目录30天以前的目录
[ $? -eq 0 ]; echo "This `date +%Y-%m-%d` MySQL BACKUP is SUCCESS"
cd /data/backup/mysql/ && find . -type d -mtime +30 |xargs rm -rf
echo "The mysql backup successfully "
3)[root@localhost ~]# bash mysql-back-auto.sh
This 2020-04-15 MySQL BACKUP is SUCCESS
The mysql backup successfully
可以看到已经成功
发现是有数据的
22.4.2 nginx 服务器启动脚本