第二十二章 跳出循環-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:
	*********************
	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 `   ; $( 命令 ) ; ${ 變量 }  ; [ 表達式/條件 ]  

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

Linux架構師高薪入口:
1.學神IT教育官方網站: http://xuegod.ke.qq.com
2.10年行業資深老鳥MK:QQ2659153446
3.加入Linux技術交流QQ羣:722287089,即可獲得以下福利:
①定期分享免費學習資料與視頻(工具+筆記+拓展實戰)
②10年行業資深老鳥在線答疑:技能+實戰+項目分享+高薪就業
③有機會免費領取Linux雲計算集羣架構師4冊書籍

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 is 2222222

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 is function
/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 current num is $num

[root@xuegod63 ~]# sh fun-3.sh 
Input a value: 22
current num is 110

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 函數中變量的處理

函數使用的變量類型有兩種:

  •  局部變量
  •  全局變量

1、全局變量,默認情況下,你在腳本中定義的變量都是全局變量,你在函數外面定義的變量在函數內也可以使用
例子:

[root@xuegod63 ~]# cat fun-5.sh 
#!/bin/bash
function fun1 {
        num1=$[var1*2]
}
read -p "input a num:" var1
fun1
echo the new value is: $num1

[root@xuegod63 ~]# bash fun-1.sh 
input a num:2
the new value is: 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@localhost shell]# cat mysql-back-auto.sh
    #!/bin/sh
    #auto backup mysql
    #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 KaTeX parse error: Expected 'EOF', got '#' at position 35: … exit fi #̲Use mysqldump b…MYSQLUSR -p$MYSQLPW $MYSQLDB > BAKDIR/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 "

22.4.2 nginx服務啓動腳本

此nginx腳本中使用了函數功能,讓腳本具有更強的可讀性

[root@xuegod63 ~]# vim /etc/init.d/nginx    
#!/bin/bash
#chkconfig: 2345 80 90
#description:nginx run

# nginx啓動腳本
# @author	Devil
# @version	0.0.1
# @date		2018-05-29

PATH=/data/soft/nginx
DESC="nginx daemon"
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 "nginx not 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 $DESC configuration..."
		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

Linux架構師高薪入口:
1.學神IT教育官方網站: http://xuegod.ke.qq.com
2.10年行業資深老鳥MK:QQ2659153446
3.加入Linux技術交流QQ羣:722287089,即可獲得以下福利:
①定期分享免費學習資料與視頻(工具+筆記+拓展實戰)
②10年行業資深老鳥在線答疑:技能+實戰+項目分享+高薪就業
③有機會免費領取Linux雲計算集羣架構師4冊書籍
微信公衆號:
在這裏插入圖片描述
MK老師微信號:
在這裏插入圖片描述
總結:

  • 22.1 跳出循環
  • 22.2 Shift參數左移指令
  • 22.3 函數的使用
  • 22.4 實戰-自動備份mysql數據庫和nginx服務啓動腳本
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章