4

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

本节所讲内容:

22.1  跳出循环

22.2  Shift参数左移指令

22.3  函数的使用

22.4  实战-自动备份mysql数据库和nginx服务启动脚本

 

22.1  跳出循环

在我们使用循环语句进行循环的过程中,有时候需要在未达到循环结束条件时强制跳出循环,那么Shell给我们提供了两个命令来实现该功能:break和continue

 

22.1.1 break和continue

Break:跳出整个循环

Continue:跳过本次循环,进行下次循环

break概述:跳出当前整个循环或结束当前循环,在for、while等循环语句中,用于跳出当前所在的循环体,执行循环体之后的语句,后面如果什么也不加,表示跳出当前循环等价于break 1,也可以在后面加数字,假设break

3表示跳出第三层循环

 

  continue概述:忽略本次循环剩余的代码,直接进行下一次循环;在for、while等循环语句中,用于跳出当前所在的循环体,执行循环体之后的语句,如果后面加的数字是1,表示忽略本次条件循环,如果是2的话,忽略下来2次条件的循环

 

互动:先演示一下效果,让大家思考一下,这个脚本的思路,然后我再带着你去写脚本。

 

例1:写一个shell菜单,当按数字键4时退出,否则一直循环显示

[root@xuegod63~]# vim break-continue.sh

#! /bin/sh

while true

do

          echo"*******************************"

          echo "Please select your operation:"

          echo " 1 Copy"

          echo " 2 Delete"

          echo " 3 Backup"

          echo " 4 Quit"

          echo"*******************************"

          read op

 case $op in

    1)

          continue   #这里加了continue后,后面的echo命令就不执行了

          echo "your selection is Copy"

          ;;

    2)

               echo "your selection is Delete"

          ;;

    3)

          echo "your selection is Backup"

          ;;

    4)

          echo "Exit ..."

          break   #跳出循环体

          ;;

     *)

        echo"invalide selection,please try again"

  esac

done

 

例2:使用交互式方法批量添加用户

[root@xuegod63

~]# cat adduser.sh

#!/bin/bash

while :

do

         read -p"Please enter prefix & password & num:" pre pass num

         printf"user information:

         *********************

         userprefix:   $pre

         user password:$pass

         usernumber:   $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 `   ;$( 命令 ) ; ${ 变量}  ; [ 表达式/条件] 

 

do

         user=${pre}${i}

         id $user&> /dev/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

done

 

扩展: seq命令:seq命令用于产生从某个数到另外一个数之间的所有整数。

[root@xuegod63 ~]# seq 5  #输出 1-5的数字

1

2

3

4

5

 

 

22.2  Shift参数左移指令

shift命令用于对参数的移动(左移),通常用于在不知道传入参数个数的情况下依次遍历每个参数然后进行相应处理(常见于Linux中各种程序的启动脚本)

         在扫描处理脚本程序的参数时,经常要用到的shift命令,如果你的脚本需要10个或10个以上的参数,你就需要用shift命令来访问第10个及其后面的参数

作用:每执行一次,参数序列顺次左移一个位置,$#的值减1,用于分别处理每个参数,移出去的参数,不再可用

例子:加法计算器

[root@xuegod63~]# cat shift.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 一次移动2个参数

done

echo result is$sum

测试:

[root@xuegod63~]# bash a shift.sh 11 2 3 4

result is 20

 

22.3  函数的使用

函数是一个脚本代码块,你可以对它进行自定义命名,并且可以在脚本中任意位置使用这个函数,要使用这个函数,只要使用这个函数名称就可以了。使用函数的好处:模块化,代码可读性强。

22.3.1 函数创建语法

方法1:

function name{

                  commands

}

注意:name是函数唯一的名称

方法2:name后面的括号表示你正在定义一个函数

name(){

                  commands

}

 

调用函数语法:

函数名 参数1 参数2 …

调用函数时,可以传递参数。在函数中用$1、$2…来引用传递的参数

 

 

22.3.2 函数的使用

例1:

[root@xuegod63~]# cat fun-1.sh

#!/bin/bash

function fun_1{    #定义函数

        echo "this is function"

}

fun_1   #调用函数

 

注意:函数名的使用,如果在一个脚本中定义了重复的函数名,那么以最后一个为准

[root@xuegod63~]# cat fun-1.sh

#!/bin/bash

function fun_1{

        echo "this is function"

}

function fun_1{

        echo "this is 2222222"

}

fun_1

 

[root@xuegod63~]# bash fun-1.sh

this is2222222

 

22.3.3 返回值

使用return命令来退出函数并返回特定的退出码

例1:

[root@xuegod63~]# vim fun-1.sh

#!/bin/bash

function fun_1{

        echo "this is function"

        ls /etc/passwd

        return 3

}

fun_1

 

[root@xuegod63~]# bash fun-1.sh  #查看结果

this isfunction

/etc/passwd

[root@xuegod63~]# echo $?

3

 

注:状态码的确定必需要在函数一结束就运行return返回值;状态码的取值范围(0~255)

 

互动: exit 数字 和return 数字的区别?

exit整个脚本就直接退出,往回数字  ;  return只是在函数最后添加一行,然后返回数字,只能让函数后面的命令不执行,无法强制退出整个脚本的。

 

 

 

22.3.4 把函数值赋给变量使用

例子: 函数名就相当于一个命令

[root@xuegod63~]# cat fun-3.sh

#!/bin/bash

fun1(){

        read -p "Input a value: " va

        echo $[$va*5]

}

 

num=$(fun1)

echo currentnum is $num

 

[root@xuegod63~]# sh fun-3.sh

Input a value:22

current num is110

 

22.3.5 函数的参数传递

第一种:通过脚本传递参数给函数中的位置参数$1

[root@xuegod63~]# cat fun-4.sh a.txt

#!/bin/bash

fun1(){

        rm -rf $1

}

fun1 $1  

第二种:调用函数时直接传递参数

[root@xuegod63~]# touch  /root/a.txt  #创建一个测试文件

[root@xuegod63~]# cat fun-4.sh

#!/bin/bash

fun1(){

        rm -rf $1

}

fun1/root/a.txt

[root@xuegod63~]# bash fun-1.sh   #测试

[root@xuegod63~]# ls /root/a.txt

ls: 无法访问/root/a.txt: 没有那个文件或目录

 

第三种:函数中多参数传递和使用方法

[root@xuegod63~]# cat fun-5.sh

#!/bin/bash

fun1(){

        echo $[$1*5]

        echo $[$2*2]

}

fun1 5 2   #直接传两个参数

 

[root@xuegod63~]# bash fun-1.sh  #测试

25

4

 

22.3.6 函数中变量的处理

函数使用的变量类型有两种:

[if !supportLists]l  [endif]局部变量

[if !supportLists]l  [endif]全局变量

1、全局变量,默认情况下,你在脚本中定义的变量都是全局变量,你在函数外面定义的变量在函数内也可以使用

例子:

[root@xuegod63~]# cat fun-5.sh

#!/bin/bash

function fun1{

        num1=$[var1*2]

}

read -p"input a num:" var1

fun1

echo the newvalue is: $num1

 

[root@xuegod63~]# bash fun-1.sh

input a num:2

the new valueis: 4

 

22.4  实战-自动备份mysql数据库脚本和nginx服务启动脚本

22.4.1 自动备份mysql数据库脚本

从centos7.0开始,系统中自带的mysql数据库包,改为mariadb数据库。

MariaDB数据库概述:MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可 MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。MariaDB由MySQL的创始人Michael

Widenius(迈克尔·维德纽斯)主导开发,他早前曾以10亿美元的价格,将自己创建的公司MySQL AB卖给了SUN,此后,随着SUN被甲骨文收购,MySQL的所有权也落入Oracle的手中。MariaDB名称来自Michael Widenius的女儿Maria(玛丽亚)的名字。

甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。过去一年中,大型互联网用户以及Linux发行商纷纷抛弃MySQL,转投MariaDB阵营。MariaDB是目前最受关注的MySQL数据库衍生版,也被视为开源数据库MySQL的替代品。

安装mariadb数据库:

[root@xuegod63~]# yum install -y mariadb mariadb-server -y

# mariadb 是mysql的客户端命令 ;mariadb mariadb-server 是mysql服务端命令

[root@xuegod63~]# rpm -qf /usr/bin/mysql

mariadb-5.5.56-2.el7.x86_64

[root@xuegod63~]# systemctl start mariadb

登录mysql:

[root@xuegod63~]# mysqladmin  -u root password"123456"   #给root用户配置一个密码123456

[root@xuegod63~]# mysql -u root -p123456  #登录mysql数据库

MariaDB[(none)]> show databases;

MariaDB[(none)]> create database xuegod ;    #创建xuegod数据库

MariaDB[(none)]> use xuegod        #选择数据库

MariaDB[xuegod]> create table user (id int);  #创建user表,只有一个id字段

MariaDB [xuegod]>insert into user values(1);   #插入一条记录,id字段值1

MariaDB[xuegod]> insert into user values(2);  #插入一条记录,id字段值2

MariaDB[xuegod]> select * from user;   #查看表中的数据

+------+

| id   |

+------+

|    1 |

|    2 |

+------+

 

mysql自动化备份脚本:

思路:

1、检查一下运行环境: 目录是否存在,时间,权限,用户

2、运行要执行的命令:备份,导出数据。。。

3、把命令执行过程中的没有用的文件删除一下

4、弹出命令运行成功的消息

 

[root@localhostshell]# cat mysql-back-auto.sh

#!/bin/sh

#auto backupmysql

#Define PATH定义变量

BAKDIR=/data/backup/mysql/`date+%Y-%m-%d`

MYSQLDB=xuegod

#MYSQLDB=webapp

MYSQLUSR=root

#MYSQLUSR=backup

MYSQLPW=123456

#MYSQLPW=backup     #mysql数据库密码

#must use root

user run scripts 必须使用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 "Themysql backup successfully "

 

 

22.4.2 nginx服务启动脚本

此nginx脚本中使用了函数功能,让脚本具有更强的可读性

[root@xuegod63~]# vim /etc/init.d/nginx   

#!/bin/bash

#chkconfig:2345 80 90

#description:nginxrun

 

# nginx启动脚本

# @author      Devil

# @version     0.0.1

# @date          2018-05-29

 

PATH=/data/soft/nginx

DESC="nginxdaemon"

NAME=nginx

DAEMON=$PATH/sbin/$NAME   #/data/soft/nginx/sbin/nginx

CONFIGFILE=$PATH/$NAME.conf

PIDFILE=$PATH/$NAME.pid

SCRIPTNAME=/etc/init.d/$NAME

[ -x"$DAEMON" ] || exit 0

do_start()

{

         $DAEMON -c $CONFIGFILE || echo -n"nginx already running"

}

do_stop()

{

         $DAEMON -s stop || echo -n "nginxnot running"

}

do_reload()

{

         $DAEMON -s reload || echo -n"nginx can't reload"

}

case"$1" in

         start)

                  echo -n "Starting $DESC:$NAME"

                  do_start

                  echo "."

         ;;

         stop)

                  echo -n "Stopping $DESC:$NAME"

                  do_stop

                  echo "."

         ;;

         reload|graceful)

                  echo -n "Reloading $DESCconfiguration..."

                  do_reload

                  echo "."

         ;;

         restart)

                  echo -n "Restarting$DESC: $NAME"

                  do_stop

                  do_start

                  echo "."

         ;;

         *)

                  echo "Usage: $SCRIPTNAME{start|stop|reload|restart}" >&2

                  exit 3

         ;;

esac

exit 0

 

总结:

22.1  跳出循环

22.2  Shift参数左移指令

22.3  函数的使用

22.4  实战-自动备份mysql数据库和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

推荐阅读更多精彩内容