第二十二章 跳出循环-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   服务器启动脚本   

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容