第二十二章 跳出循环-shift 左移-函数的使用

本节所讲内容

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   服务器启动脚本   

你可能感兴趣的:(第二十二章 跳出循环-shift 左移-函数的使用)